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)
Но двойной тип сохраняется компилятором при составном присваивании.
Это определение оператора
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)