我知道尽可能多地创建一个类非成员非朋友的界面是个好主意,我刚刚意识到对于我的3D矢量类'Vector3',我可以移动+ =, - =等等操作符离开类,只留下构造函数和复制赋值运算符。
问题是:这个运算符应该是什么样的?我已经看过许多其他运营商的规范形式并遵循他们的建议,但我还没有看到这些运营商的规范形式。我已经给出了我认为应该在下面的内容。
第二个问题是:这些运营商甚至被称为什么?算术赋值运算符?
之前的(相关)代码:
class Vector3 {
public:
Vector3& operator+=(const Vector3& rhs);
float x, y, z;
};
Vector3& Vector3::operator+=(const Vector3 &rhs) {
x += rhs.x;
y += rhs.y;
z += rhs.z;
return *this;
}
到目前为止我改变了它:
class Vector3 {
public:
float x, y, z;
};
Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
lhs.x += rhs.x;
lhs.y += rhs.y;
lhs.z += rhs.z;
return lhs;
}
答案 0 :(得分:2)
你对我看起来很好。
顺便说一句,当你来到运营商+时,通常用+ =来实现。 (创建lhs的副本,然后调用lhs + = rhs并返回结果)
不知道你是否已经意识到这个技巧,但是由于你担心实现这些操作符的规范方法,所以提起它并不会有什么坏处。 :)
答案 1 :(得分:1)
你看起来很棒。
直观地思考这个问题的基本方法是考虑编写代码时的代码。在这种情况下,如果你可以写
Vector v, w;
v += w;
w += v;
依此类推,你走在正确的轨道上。
有很多好的经验法则可以提供帮助;请参阅C ++常见问题解答中的this entry。
答案 2 :(得分:0)
我不会说“尽可能多的接口”。将operator+=
,operator-=
等作为非朋友非成员,并没有多少收获。
有些人倾向于使每个功能成为非成员非朋友功能,以抵制使用私有成员变量的诱惑。但您是成年人:您可以将该函数编写为公共成员,而不是使用私有成员变量。我更喜欢知道该函数与类绑定,并使其成为公共成员使其明确。
除了注意:
就个人而言,我发现使用私人成员而不是公共访问者通常是可以的(我知道 - 我会在地狱中燃烧)。不总是! - 但经常
实际上,如果您确定需要,几乎没有几分钟您无法以分钟的方式切换到公共访问者。但我认识到这不是一种流行的观点,我不会要求人们遵循这一理念。
有明确的理由使确定功能和操作员“非朋友,非会员”。例如,当用作“流插入运算符”时,运算符<<()不能成为成员,因为您必须更改lhs类(流)。