2011-02-10 1 views
2

이 중요한 xxxxxxxx 파생 클래스에서 C++ 메소드의 const'ness를 얻는 방법

같은 중요한 후크 방법을 정의하는 프레임 워크를 사용해야합니다. 파생 된 클래스에서 나는 후크를 통해 얻는 값을 저장해야합니다.

class MyClass: public FrameworkClass 
{ 
    ... 
    virtual void OnEventA(unsigned value) const { savedValue = value; } // error! 

private: 
    unsigned savedValue; 
} 

불행히도 프레임 워크를 변경할 수 없습니다.

후크 방법의 const'ness를 해결하는 좋은 방법이 있습니까?

답변

4

mutable도 "넓은"해결 방법입니다. 해결 방법으로 부적절한 const'ness가 있습니다. const_cast :

class MyClass: public FrameworkClass 
{ 
    ... 
    virtual void OnEventA(unsigned value) const { const_cast<MyClass*>(this)->savedValue = value; } // error! 

private: 
    unsigned savedValue; 
} 
+1

const_cast는 분명히 옵션입니다. 나는 "광범위"를 사용할 수도 있지만 " const_cast는 함수가 상태를 바꾼다는 것을 명확하게 보여 주며, mutable은 const 함수로도 멤버를 변경할 수 있음을 나타내지 만, 후자는 메커니즘을 캐싱하는 데 특히 유용합니다. – larsmoa

+5

이 값이 유효하려면 메서드가 아닌 const 개체에서 호출 된 있는지 확인하십시오. 나는 OnEventA에서 그렇게 있는지 확인하는 방법이 있다고 생각하지 않습니다. – visitor

+0

@larsm : "광범위 함"은 OnEventA()뿐 아니라 다른 모든 메서드에도 영향을 미친다는 것을 의미합니다. –

5

변수가 변경 가능한 확인하십시오 올바르게 const'ness를 사용하는 방법에 영향을주기 때문에
mutable unsigned savedValue;

+0

Excelent answer, thanks! –

+0

당신은 환영합니다. (: –

+3

이 작업이 진행되는 동안'mutable '은 * logical * 상태가 아닌 * bitwise * 상태의 일부를 형성하는 것들을 위해 실제로 디자인되었습니다. 내부 캐쉬, 지연 평가 스킴, 참조 카운팅 등을 예로들 수 있습니다. –