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)
但是复合赋值时编译器会保留double类型。
答案 0 :(得分:1)
此运算符定义
Point operator +=(double & left, const Point & right) {
return Point(left + right.x, left + right.y, left + right.z);
}
是错误的,因为它没有为左操作数赋值,也没有返回指定对象的左值。
通常,最好将这些运算符定义为类成员函数。
我会按以下方式定义
class Point
{
//...
Point & operator +=( const Point &rhs )
{
x += rhs.x;
y += rhs.y;
z += rhs.z;
return *this;
}
//...
};
至于你的代码,尤其是这句话
a += b;
然后不清楚是否有转换构造函数将double类型的对象(对象的类型)转换为Point类型,因为您没有显示类定义。正如我已经指出的那样,你定义的运算符不会改变左操作数(一个Point类型的临时对象,它将根据对象a
创建)。因此,即使上述记录在任何情况下都是正确的,原始对象a
也不会被更改。
对于用作左操作数的double类型的对象,您可以定义operator +而不是operator + =。
例如
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)