2011-02-05 5 views
0

클래스 Foo이 포인터를 변환 할 수 없습니다.

class Foo 
{ 
public: 
    void set_bar(int val) 
    { 
     _bar = val; 
    } 

protected: 
    int _bar; 
}; 
Baz 다음과 같이 선언 된 클래스 Baz에 의해 상속 된 것처럼 보입니다 :

class Baz 
    : public Foo 
{ 
public: 
    void set_baz(int val) 
    { 
     _baz = val; 
    } 

protected: 
    int _baz; 
}; 

그런 다음 형식의 멤버 변수가 들어있는 Factory 클래스가 있습니다. Baz.

class Factory 
{ 
protected: 
    Baz _baz; 
public: 
    const Baz& get_baz() const 
    { 
     return _baz; 
    } 
}; 

다음과 같이 Factory을 사용한 경우 :

Factory f; 
f.get_baz().set_bar(1); 

error C2662: 'Foo::set_bar' : cannot convert 'this' pointer from 'const Baz' to 'Foo &'

를 발생시킵니다.

답변

1

당신은 바즈에 대한 const가 아닌 참조를 반환 공장 :: get_baz의 const가 아닌 버전을 제공해야 그렇지 않으면 get_baz의 비 const 버전이 호출됩니다.

또한 이름에 선행 밑줄을 사용하지 마십시오. What are the rules about using an underscore in a C++ identifier?을 참조하십시오.

+1

내 코드에 실제 코드의 밑줄을 붙이지 않습니다. 읽어 주셔서 감사합니다. – SimpleButPerfect

1

get_baz에 의해 반환되는 객체는 상수, 당신이 그 내용을 수정할 수 없습니다 던졌습니다.

+0

아야, 나는 그것을 보지 못했다. .. 고마워. – SimpleButPerfect

0

get_baz를 호출하면 상수 및 상수 객체는 상수 함수 만 호출 할 수 있습니다.

class Factory 
{ 
protected: 
    Baz _baz; 
public: 
    const Baz& get_baz() const 
    { 
     return _baz; 
    } 

    Baz& get_baz() 
    { 
     return _baz; 
    } 
}; 

CONST 공장을 사용하여, get_baz의 CONST 버전이 호출 얻을 것이다 :

0

개체에 대한 const가 아닌 참조를 반환하는 경우에만 값을 변경할 수 있습니다.

const가 아닌 참조를 반환하는 경우 멤버를 공개하지 않는 것이 좋을까요? 당신은 같은 효과를 얻을거야 ...

관련 문제