C++ C++;将运算符重载为类成员

C++ C++;将运算符重载为类成员,c++,operator-overloading,C++,Operator Overloading,当我遇到一个问题时,我正试图创建一个简单的向量类。 这是我的代码片段: class Vector2D{ protected: int x, y; public: Vector2D operator - (const Vector2D&); friend int SumDiff(const Vector2D& obj1, const Vector2D& obj2); }; Vector2D Vector2D::operator - (con

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

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

仅当运算符
-
作为非成员函数重载时,此代码才似乎可以编译。为什么?


提前感谢。

您的操作员必须声明为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/getter),以便可以访问
x
y

您的
运算符-
成员函数未标记为
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;
    }
    

    最后,为了在生产中使用,请考虑使用此大部分自动授权给您。

    或使用标准约定并声明为免费函数。抱歉,错过了这一点。