定义我自己的运营商的麻烦......

时间:2011-07-30 18:32:59

标签: c++ operators

我只是在四处寻找定义运营商的工作方式。以下代码给出了关于“找不到候选函数”的错误。

除了根本原因之外的任何批评也是受欢迎的。谢谢!

#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;
}

5 个答案:

答案 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;
};