2011-07-30 6 views
0

저는 연산자 정의의 작동 방식을 보면서 방황하고 있습니다. 다음 코드는 "후보 함수가 없습니다"라는 오류 메시지를 표시합니다.내 연산자를 정의하는 데 문제가 있습니다 ...

근본 원인 이외의 비판도 환영합니다. 감사!

#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

어떤 줄에 오류가 있습니까? –

+0

다음 번엔 우리가 뼈를 던져서 적어도 그것이 무엇인지에 관해 말하면 좋을 것입니다. 정확한 오류 메시지의 복사본도 가지고 있으면 좋을 것입니다. –

답변

2
const string getStr() { return str; } 

const string& getStr() const { return str; } 

그렇지 않으면 당신이, 민간 공공 및 보호 가시성 클래스 수준에 있음을

SomeClass& operator=(const SomeClass& rh) 
+0

그래서 명확히하기 위해 : 첫 번째 'const'는 함수가 const 문자열을 반환한다는 것을 의미하고 두 번째 'const'는 함수 자체가 const임을 의미합니다. (이 경우 const 함수가 무엇인지 이해할 수 없다.) – loneboat

+0

두 번째'const'는'this'가 const 객체를 가리킨다는 것을 의미한다.즉, 함수를 호출하는 인스턴스의 멤버를 수정할 수 없으므로 const 인스턴스에서 함수를 호출 할 수 있습니다. – ybungalobill

0

모든 것은 지금까지를 제외하고 당신이 당신이이를 포함 할 필요가

#include <string> 

포함되지으니 잘 보인다. 가 아닌 인 getStr()를 호출하고,

SomeClass& operator=(const SomeClass& rh) { 
     string newVal(rh.getStr()); 
     str = newVal; 
     return *this; //DO THIS AS WELL 
    } 

또한, rh이 함수에 const를 객체 인을하고 사용 :

오 나는 또한 당신이 함수에서 아무것도 반환하지 않는 것을보고 -const function 이 문제의 원인입니다. 그래서 수정은 이것이다 :

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 
    } 

!

2

주의 const를 매개 변수에 const가 아닌 함수를 호출 할 수 있어야한다 인스턴스 수준이 아닙니다. 따라서 getStr() 기능이 필요하지 않습니다. 당신은 쓸 수 :

SomeClass& operator=(const SomeClass& rh) { 
    this->str = rh.str; 
    return *this; 
} 
+0

흥미 롭습니다 - 인스턴스 A는 동일한 클래스 인 경우 인스턴스 B의 모든 멤버에 액세스 할 수 있습니까? – loneboat

0

을 그냥 CONST 객체가 const 멤버 함수를 호출 만 할 수 있으며,이 일을하려고하고 있기 때문입니다

const string getStr() { return str; } 

const string getStr() const { return str; } //the 2nd const make getStr() a const member function 
         ^^^^ 

에 변경해야합니다 :

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; 
    } 
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; 
}; 
관련 문제