我只是在四处寻找定义运营商的工作方式。以下代码给出了关于“找不到候选函数”的错误。
除了根本原因之外的任何批评也是受欢迎的。谢谢!
#include <iostream>
using std::cout; using std::cin; using std::endl;
using std::string;
class SomeClass {
public:
SomeClass(int newNum, string newString) { num=newNum; str = newString; }
SomeClass& operator=(const SomeClass& rh) {
string newVal(rh.getStr());
str = newVal;
}
void setStr(string newString) { str = newString; }
const string getStr() { return str; }
string toString() { return str+str; }
private:
string str;
int num;
};
int main() {
SomeClass a(5, "five");
SomeClass b(3, "three");
cout << a.toString() << endl << b.toString() << endl;
a=b;
cout << a.toString() << endl << b.toString() << endl;
}
答案 0 :(得分:2)
const string getStr() { return str; }
应该是
const string& getStr() const { return str; }
否则,您无法在
的const参数上调用非const函数SomeClass& operator=(const SomeClass& rh)
答案 1 :(得分:2)
请注意,私有,公共和受保护的可见性是在类级别,而不是实例级别。因此不需要getStr()
函数。你可以写:
SomeClass& operator=(const SomeClass& rh) {
this->str = rh.str;
return *this;
}
答案 2 :(得分:0)
到目前为止一切看起来都很好,除非你没有包括
#include <string>
您也需要包含此内容。
哦,我也看到你没有从函数中返回任何东西:
SomeClass& operator=(const SomeClass& rh) {
string newVal(rh.getStr());
str = newVal;
return *this; //DO THIS AS WELL
}
此外,rh
是此函数中的const对象并使用它,您正在调用getStr()
这是一个导致问题的非const函数。所以修复就是这样:
const string getStr() const { return str; }
// ^^^^^ make the function const!
另外,您可以按如下方式编写operator=
:
SomeClass& operator=(const SomeClass& rh) {
str = rh.str; //no need to create a local (temporary) variable!
return *this; //DO THIS AS WELL
}
我认为这是更好的解决方案!
答案 3 :(得分:0)
您只需要更改
const string getStr() { return str; }
到
const string getStr() const { return str; } //the 2nd const make getStr() a const member function
^^^^
这是因为const对象只能调用const成员函数而你试图这样做:
SomeClass& operator=(const SomeClass& rh) { //here you declared rh to be const
//so in order to call getStr() from rh, you need declare getStr function to be const
string newVal(rh.getStr());
str = newVal;
return *this;
}
答案 4 :(得分:0)
所以你的班级可能看起来像这样:
class SomeClass {
public:
SomeClass(int newNum, string newString):num(newNum), str(newString) {/* Empty */}
SomeClass& operator=(const SomeClass& rh) {
str=rh.str;
return *this;
}
string toString() { return str+str; }
private:
string str;
int num;
};