Как перегрузить составное присваивание в C ++?

point.h

...
Point operator +=(double & left, const Point & right) {
return Point(left + right.x, left + right.y, left + right.z);
}
// std::ostream is overloaded
...

main.cpp

#include <iostream>
#include "point.h"
int main() {
double a = 1.0;
Point b(1.0, 1.0, 1.0);
a += b;
std::cout << a << std::endl;
}

Выход:

1

Я хотел бы вернуть сумму:

(2, 2, 2)

Но двойной тип сохраняется компилятором при составном присваивании.

-1

Решение

Это определение оператора

Point operator +=(double & left, const Point & right) {
return Point(left + right.x, left + right.y, left + right.z);
}

неверно, потому что он ничего не назначает левому операнду и не возвращает lvalue назначенного объекта.

В целом, такие операторы лучше определять как функции-члены класса.

Я бы определил это следующим образом

class Point
{
//...
Point & operator +=( const Point &rhs )
{
x += rhs.x;
y += rhs.y;
z += rhs.z;

return *this;
}
//...
};

Что касается вашего кода и особенно это утверждение

a += b;

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

Для объектов типа double, используемых в качестве левого операнда, вы можете определить оператор + вместо оператора + =.

Например

const Point operator +( double lhs, const Point &rhs )
{
Point p( rhs.x + lhs, rhs.y + lhs, rhs.z + lhs );

return p;
}

Детали реализации для вашего класса могут отличаться, потому что я не вижу определения класса. Тем не менее это определение демонстрирует идею.

В этом случае вы могли бы написать

double a = 1.0;
Point b( 1.0, 1.0, 1.0 );

std::cout << a + b << std::endl;

и получить ожидаемый результат

(2, 2, 2)
1

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


По вопросам рекламы [email protected]