重载二进制+

时间:2010-10-10 14:12:51

标签: c++ operator-overloading

我有抽象类:

#include <string>

using namespace std;

class AString
{
    public:
        virtual ~AString() {}

        virtual const string& GetName() const = 0;
        virtual const string& GetValue() const = 0;
        virtual const int GetSize() const = 0;
};

衍生课程。我尝试在这个类中重载二进制+:

class SymbString : public AString
{
    private:
        string name;
        string val;

    public:
        SymbString() {}

        SymbString(string _name) : name(_name) {}

        SymbString(string _name, string _val) : name(_name), val(_val) {}

        const string& GetName() const { return name; }

        const string& GetValue() const { return val; }

        const int GetSize() const { return val.size (); }

        const string& SetValue(string value) 
        {
            val = value;
            return val;
        }

        SymbString operator + (const SymbString &str1, const SymbString &str2)
        {

        }

};

但是看错误: SymbString operator +(const SymbString&amp; str1,const SymbString&amp; str2)必须采用零或一个参数

怎么了?

谢谢。

3 个答案:

答案 0 :(得分:2)

您需要将其放入SymbString的封闭命名空间中。不是会员。

或作为成员,但只指定正确的参数。但是"Hello" + symb将不再有效,因为左侧不是SymbString。因此,建议将其作为SymbString命名空间中的非成员编写。

请注意,要能够说出symb + "Hello"或反过来甚至写SymbString s = "Hello";,您还需要接受char const*作为构造函数参数。否则,char const*将无法隐式转换为SymbString,因为这需要先转换为std::string,然后再转换为SymbString。在单个隐式转换序列中不允许两个这样的用户定义的转换。

答案 1 :(得分:2)

您将其定义为实例方法。这意味着左操作数将是接收器(this),右操作数将是函数的参数。

如果您希望两个操作数都是参数,则需要将方法定义为静态,或者将类定义为类外的函数。

答案 2 :(得分:1)

我猜你试图引入operator+作为该类的成员函数。那是错的。将其定义为自由函数。或者operator+=作为成员并通过它实现免费功能operator+