2011-12-22 2 views
3

에 함수 포인터 나는이 수업 C++ : 다른 클래스 기능

class B { 
public: 
    int func(int i); 
}; 

class A { 
public: 
    typedef int (B::*fPtr)(int); 
    void run(); 
    B* mB; 
}; 

void A::run() { 
    // create a pointer 
    fPtr p = &(B::func); 
    // invoke the function 
    mB->*p(2);  <------- Compilation Error 
} 

내가 뭘해야 할 것은 A의 실행 기능에 FUNC()에 대한 포인터를 만드는 것입니다

있습니다. mB가 1 개의 인수를 가진 함수에 해당하지 않는다는 컴파일 오류가 발생합니다. 왜 mB->func(2);를 호출 할 수 없습니다

+0

왜 당신이 그렇게 복잡하고있다를? 상속으로 태그를 붙인 이유는 무엇입니까? 인터페이스에 대해 들어 봤어? –

+1

왜 std :: function/boost :: function을 사용하지 않습니까? 그들은 바보 같은 C 스타일 함수 포인터보다 훨씬 더 유연하고 사용하기가 훨씬 쉽습니다. – Lalaland

+1

@EthanSteinberg 멤버 함수 포인터는 C 함수 포인터와 관련이 거의 없으며'std/boost :: function'에 저장할 수 없습니다. –

답변

2

클래스의 인스턴스 메소드에는 항상 this 포인터에 대한 숨겨진 첫 번째 매개 변수가 있으므로 함수 포인터 typedef와 호환되지 않습니다. 직접 멤버 함수에 대한 포인터를 얻는 방법은 없습니다. 일반적인 해결 방법은 멤버 함수를 호출 할 수있는 포인터로 정적으로 캐스팅 할 수있는 일반적인 "catch all"매개 변수 (예 : void *)를 허용하는 정적 함수를 전달하는 "썽크"를 사용하는 것입니다. 예 :이 더 '숨겨진 this을'이 없기 때문에

class B 
{ 
public: 
    static void MyThunk(void * obj) 
    { 
     static_cast<B *>(obj)->MyRealFunc(); 
    } 

    void MyRealFunc() 
    { 
     // do something here 
    } 

    // . . . 
}; 

당신은 B::MyThunk를 사용하여 참조, 쉽게 정적 함수에 대한 포인터를 얻을 수 있습니다. 함수에 추가 매개 변수가 필요한 경우 functor과 같은 것을 사용하여 필수 매개 변수와 상태를 캡처 할 수 있습니다.

당신은 확실히 당신이 모든에 대해 훨씬 더 알이 C++ FAQ 라이트 페이지를 읽어야 Pointers to member functions

+0

좋은 대답입니다. 왜'obj'의 타입은'void * '입니까? 나는'B *'를 선호한다. –

+0

@bobbymcr : 이전에'-> *'와'. *'연산자로 일 해본 적이 없다고 생각합니까? 이들은 Alex의 예제처럼 포인터를 통해 객체 인스턴스에 대한 메서드 호출을 허용합니다. 그는 자신의 코드를 올바르게 컴파일하기 위해 괄호 집합이 누락되었습니다. –

+1

@DavidGrayson : 보통 당신은'ThreadStart' 함수 포인터에만'LPVOID'를 전달할 수있게 해주는 Win32에서'CreateThread' 같은 것들과 상호 작용하기 위해서 "베어 본"포인터 타입을 사용해야합니다. 할 수있는 한 강하게 입력해야하지만 선택의 여지가 항상있는 것은 아닙니다. – bobbymcr

1

도와주세요? 다른 사람들이 지적으로

는하지만, 거의 확실하게있다
(mB->*p)(2); 

: B 아마도 virtual 기능과

+0

내 프로젝트 설계와이를 달성하고자하는 목표를 감안할 때 제가 해결할 솔루션입니다. –

6

당신은 함수 표현식 주위에 괄호를 둘 필요가 클래스 상속을 조사하기위한

당신은 다른 기능을해야하는 경우 네가하려는 일을하는 더 좋은 방법이야.

+0

우선, 도움에 감사드립니다. 위에서 언급 한 다른 것들을 사용하는 경우,이 솔루션이 제 경우에 가장 적합한 것 같아요. –