C++ 操作员+;超载问题

C++ 操作员+;超载问题,c++,operator-overloading,C++,Operator Overloading,为什么此代码会给出错误消息“IntelliSense:此运算符函数的参数太多” PerfectNum是一个常规类,thenum是一个int。 此方法在类中。您将其定义为成员函数,对吗 在这种情况下,左手侧只是*这: // .h class PerfectNum { public: int operator+(PerfectNum other) const; }; // .cpp int PerfectNum::operator+(const PerfectNum &ot

为什么此代码会给出错误消息“IntelliSense:此运算符函数的参数太多”

PerfectNum是一个常规类,thenum是一个int。
此方法在类中。

您将其定义为成员函数,对吗

在这种情况下,左手侧只是
*这

// .h
class PerfectNum
{
    public:
    int operator+(PerfectNum other) const;
};

// .cpp
int PerfectNum::operator+(const PerfectNum &other) const
{
    return this->thenum + other.thenum;
}

您需要将运算符设置为非成员函数。

运算符+应为非成员函数。返回类型应为const object。如果定义了operator=defined,那么最好也定义operator+=defined。因此,您可以根据运算符+=,实现运算符+

const PerfectNum operator+(const PerfectNum& lhs, const PerfectNum& rhs)
{
     PerfectNum ret(lhs);
     ret += rhs;
     return rhs;
}

重载运算符+在声明为类方法时当然不应该是友元/自由函数。下面是一个非常简单的实现:

class PerfectNum {
    public:
        PerfectNum(int);
        PerfectNum(const PerfectNum&);
        PerfectNum operator+(const PerfectNum&) const;
    private:
        int mNumber;
};

PerfectNum PerfectNum::operator+(const PerfectNum& rhs) const
{
    return PerfectNum(this->mNumber + rhs.mNumber);
}

这不是一个类方法,是吗?如果您将其设置为PerfectNum方法,那么您只需要一个参数,并使用“this.thenum”作为另一个参数。这就是您从编译器获得的确切错误消息吗?函数
int运算符+(PerfectNum,PerfectNum)
返回的参数太多?没有编译器会产生这样的错误消息。在这里发布编译器输出时请使用复制粘贴。有点错误。操作符应该是一个自由函数,可能是一个朋友。如果它是一个成员,它应该是const。参数应该是常量引用。语法错误-实现缺少返回类型。谁在投票支持这件事?哎呀。你说得对,这太可怕了。昨天我的工作压力很大,我需要摆脱它,但显然我把我的一些知识抛在了脑后:-)另外:我看不出有任何理由这不能成为一个成员函数。我可能缺少一些知识。如果是这样的话,请帮助我,而不是批评一切。我假设它应该是一个成员函数,因为它可以解释为什么参数太多(根据OP的错误消息)。它不应该是一个成员函数,这样就可以对左操作数和右操作数执行转换。C++中的运算符+几乎从来没有被实现为成员函数,因为这个。+ 1 SHIESH。所有的人都投票支持错误的答案,只有一人支持你的正确答案,我觉得有必要在这里投票。还有其他所有回答正确的人。我能对为什么它不应该是一个成员函数有一个好的、可靠的解释吗?有人告诉我,如果你想将它限制为左手边的
PerfectNum
,这是可以的;由于OP只希望它位于两个
PerfectNum
对象之间,因此我认为应该使用成员函数。
class PerfectNum {
    public:
        PerfectNum(int);
        PerfectNum(const PerfectNum&);
        PerfectNum operator+(const PerfectNum&) const;
    private:
        int mNumber;
};

PerfectNum PerfectNum::operator+(const PerfectNum& rhs) const
{
    return PerfectNum(this->mNumber + rhs.mNumber);
}