我有抽象类:
#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)必须采用零或一个参数
怎么了?
谢谢。
答案 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+
。