当我遇到问题时,我试图创建一个简单的向量类。 这是我的代码片段:
class Vector2D{
protected:
int x, y;
public:
Vector2D operator - (const Vector2D&);
friend int SumDiff(const Vector2D& obj1, const Vector2D& obj2);
};
Vector2D Vector2D::operator - (const Vector2D& param)
{
Vector2D obj;
obj.x = x - param.x;
obj.y = y - param.y;
return obj;
}
int SumDiff(const Vector2D& obj1, const Vector2D& obj2)
{
int result;
Vector2D obj3;
obj3 = obj1 - obj2;
result = obj3.x + obj3.y;
return result;
}
第obj3 = obj1 - obj2;
行突出显示为错误。具体来说,此行中的运算符-
似乎不将Vector2D
个对象作为操作数。
即使SumDiff
函数是Vector2D
类的一部分,也会出现同样的问题。
如果运算符-
作为非成员函数重载,则此代码似乎只能编译。为什么呢?
提前致谢。
答案 0 :(得分:3)
您的运算符必须声明为const:
Vector2D operator - (const Vector2D&) const;
否则,您无法将其与obj2
const
一起使用。
正如NathanOlivier评论的那样,你也可以在课堂外声明这个操作符:
Vector2D operator - (const Vector2D& left, const Vector2D& right)
{
Vector2D obj;
obj.x = left.x - right.x;
obj.y = left.y - right.y;
return obj;
}
然后,您需要让它成为您班级的朋友(或添加setter / getters),以便可以访问x
和y
。
答案 1 :(得分:1)
您的operator -
会员功能未标记为const
,这意味着:
*this
(左侧opearnd)const
限定对象作为左侧操作数由于operator -
应该不修改其任何一个操作数,只需将其标记为const
:
Vector2D operator - (const Vector2D&) const;
请注意,通常,在可能的情况下,将二元运算符实现为非成员通常会更好。原因是隐式转换中的对称性。作为成员实现的二元运算符可以在其右侧操作数上使用隐式转换,但不能在左侧使用它们(因为操作数首先需要正确的类型来查找运算符)。 / p>
由于您通常也希望复合赋值运算符存在,因此常见的模式是根据复合赋值实现非成员二元运算符,如下所示:
Vector2D& Vector2D::operator -= (const Vector2D &rhs)
{
x -= rhs.x;
y -= rhs.y;
return *this;
}
Vector2D operator - (Vector2D lhs, const Vector2D &rhs)
{
lhs -= rhs;
return lhs;
}
最后,要在生产中使用,请考虑使用Boost.Operators为您执行大部分自动委派。