2009-03-11 6 views
3

상수 객체에 대한 포인터를 사용하여 멤버 함수 포인터를 호출하려면 어떻게해야합니까?

다음은 내가 성취하고자하는 방법의 예입니다.

class MyClass 
{ 
    public: 
     void Dummy() const{} 

}; 
typedef void (MyClass::*MemFunc)(); 

void (const MyClass * instance) 
{ 
    MemFunc func=&MyClass::Dummy; 
    // (instance->*func)(); //gives an error 
     (const_cast<MyClass *>instance->*func)(); // works 
} 

왜 컴파일러 (gcc 3 & 4)는 인스턴스가 비 const이어야한다고 주장합니까? const_cast가 문제를 일으킬까요?

FYI : instance`는 반드시 const 일 필요는 없습니다. 다만 피 호출자가 혼란에 빠지 길 바라지 않습니다.

여기서 무엇이 일어나고 있습니까?

답변

7

오류는 이전 줄에 있습니다. typedef를

으로 변경하십시오.
typedef void (MyClass::*MemFunc)() const; 

const 멤버 함수 유형에 대한 포인터로 만들려면 다음과 같이하십시오.

이 코드를 고려하면 차이는 더 명확 수 있습니다 그것은 작동하는 방법 :

typedef void FunctionType() const; 
typedef FunctionType MyClass::*MemFunc; 

특히 멤버 함수 포인터는 실제로 일반적으로 멤버 포인터 단지 특별한 경우입니다. const 멤버 함수의 경우 멤버 함수의 함수 유형이 비 const 멤버 함수의 경우와 다릅니다. 이것이 유형이 일치해야하는 이유입니다.

0

타입 정의 공극 (MyClass에 MemFunc :: *)();

여기

당신은 의 객체를 수정할 수있는 기능에 대한 포인터를 정의하고 있습니다.

MemFunc FUNC = & MyClass에 :: 더미; 여기

당신이 함수를 할당하는 하지 않습니다 이러한 포인터에 그것의 객체 변화. 이 변경되지 않기 때문에의 하위 집합 인 으로 변경 될 수 있습니다.

(인스턴스 -> * func)(); 여기

당신은 변경할 수 없습니다 객체를 사용하여 그 객체를 변경할 수있는 함수를 호출하려고합니다.

MemFunc의 정의를 변경해야합니다.

관련 문제