Предположим, я определил эту структуру:
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;
надо разбираться отдельно?
Просто сделай это:
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
). В этом случае первая перегрузка выше будет обрабатывать
все три случая.
Вот как бы я это сделал.
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; }
В C ++ есть только одно различие между структурой и классом: в структуре видимость по умолчанию является общедоступной, а в классе — закрытой.
Кроме этого вы можете делать все, что вы делаете в классе в структуре, и это будет выглядеть точно так же.
Напишите перегрузку операторов в структуре, как в классе.
Это также будет работать:
struct Point{
double x,y;
Point& operator+(const Point& rhs){
x += rhs.x;
y += rhs.y;
return *this;
}
}