Перегрузка операторов в структуре

Предположим, я определил эту структуру:

struct Point {
double x, y;
};

Как я могу перегрузить + оператор так, что, объявил,

Point a, b, c;
double k;

выражение

c = a + b;

доходность

c.x = a.x + b.x;
c.y = a.y + b.y;

и выражение

c = a + k;

доходность

c.x = a.x + k;
c.y = a.y + k; // ?

Сохранится ли коммутативное свойство в последнем случае? То есть сделать c = a + k; а также c = k + a; надо разбираться отдельно?

10

Решение

Просто сделай это:

Point operator+( Point const& lhs, Point const& rhs );
Point operator+( Point const& lhs, double rhs );
Point operator+( double lhs, Point const& rhs );

Что касается вашего последнего вопроса, компилятор делает нет
предположения относительно того, что делает ваш оператор. (Помните, что
+ оператор на std::string является не коммутативный.) Так ты
должны обеспечить обе перегрузки.

Кроме того, вы можете предоставить неявное преобразование
double в Point (имея конвертирующий конструктор в
Point). В этом случае первая перегрузка выше будет обрабатывать
все три случая.

14

Другие решения

Вот как бы я это сделал.

struct Point {
double x, y;
struct Point& operator+=(const Point& rhs) { x += rhs.x; y += rhs.y; return *this; }
struct Point& operator+=(const double& k) { x += k; y += k; return *this; }
};

Point operator+(Point lhs, const Point& rhs) { return lhs += rhs; }
Point operator+(Point lhs, const double k) { return lhs += k; }
Point operator+(const double k, Point rhs) { return rhs += k; }
6

В C ++ есть только одно различие между структурой и классом: в структуре видимость по умолчанию является общедоступной, а в классе — закрытой.

Кроме этого вы можете делать все, что вы делаете в классе в структуре, и это будет выглядеть точно так же.

Напишите перегрузку операторов в структуре, как в классе.

5

Это также будет работать:

struct Point{
double x,y;
Point& operator+(const Point& rhs){
x += rhs.x;
y += rhs.y;
return *this;
}
}
3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector