C++类成员运算符重载

3

我试图创建一个简单的向量类,但遇到了问题。 这是我的代码片段:

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类的一部分,仍然会出现相同的问题。

只有在将运算符-重载为非成员函数时,此代码才能编译通过。为什么?

谢谢!

2个回答

3

您的操作符必须声明为const:

Vector2D operator - (const Vector2D&) const;

否则,您不能将其与constobj2一起使用。
正如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/getter),以便可以访问xy


或者使用标准约定并将其声明为自由函数。 - NathanOliver
抱歉,不知何故错过了那一部分。 - Angew is no longer proud of SO

1
您的operator -成员函数没有标记为const,这意味着它:
  • 声明它可以修改*this(左操作数)的状态
  • 因此不能用一个带有const限定符的对象作为左操作数来调用它

由于operator -肯定不会修改其任何操作数,因此只需将其标记为const即可:

Vector2D operator - (const Vector2D&) const;

请注意,一般情况下,如果可能的话,最好将二元操作符实现为非成员函数。原因是隐式转换的对称性。作为成员函数实现的二元操作符可以在其右侧操作数上使用隐式转换,但不能在左侧操作数上使用它们(因为操作数需要适当的类型才能首先找到运算符)。
由于通常还希望存在复合赋值运算符,因此常见的模式是通过复合赋值来实现非成员二元操作符,如下所示:
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来自动委派大部分操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接