2013-05-09 1 views
1

죄송합니다. 이전에 답변을 받았음을 확신하지만, 답을 찾으려 애쓰며 찾고 싶어하지 않습니다. .. 어쨌든 ..비 정적 메소드 포인터를 다른 메소드의 인수로 전달

class foo 
{ 
    void read(void (*func)(obj&)) 
    { 
     // many things happen to obj... 
     (*func)(obj); // Calls the function pointer to the handler. 
    } 

}; 
class bar : public foo 
{ 
    void handler(obj&) 
    { 
     // 
    } 
}; 

void main() 
{ 
    foo f; 

    typedef void (foo::*funcptr)(obj&); 
    funcptr ptr = &foo::handler; 

    f.read(ptr); ???? 
} 

그래서 기본적으로 내가 할 노력하고있어 모든 콜백이 실행될 때, 그래서 읽기 방법에 대한 함수 포인터로 핸들러라는 비 정적 멤버 메소드를 전달되면, 핸들러가 호출됩니다.

나는이 작업을하기 위해 모든 종류의 방법을 시도 했으므로 정적 방법을 사용하고 싶지 않습니다. 나는 내가 가깝다고 생각하지만, 결국에는 끝났다. 어떤 도움을 주시면 감사하겠습니다.

+1

FAQ 라이트를 확인해보십시오.이 섹션은 다음과 같이 잘되어 있습니다 : http://www.parashift.com/c++-faq/pointers-to-members.html – Constantin

답변

1

당신은 그렇게 할 수 없습니다 : 스스로 호출 할 수있는 정적 함수와는 달리, 멤버 함수 호출은 호출되는 함수와 호출 할 객체의 두 가지 지식을 필요로합니다. 그래서 "일반"함수 포인터를 기대하는 API에 멤버 함수를 전달할 수 없습니다.

foo 클래스의 소스에 액세스 할 수없는 경우 잘 알려진 위치 (즉, 정적 변수)에 저장된 객체에서 멤버 함수를 호출하는 정적 함수를 만들 수 있습니다. 그렇다면 표준 C++ 라이브러리의 기능과 유사한 API를 변경하여 함수 객체를 가져 오는 것이 좋습니다.

마지막으로 C 라이브러리에서 함수 포인터를 사용하는 일반적인 접근 방식이 있습니다 (추가 포인터 void* 포인터 전달).이 포인터는 함수 포인터를 호출 할 때 다시 전달됩니다. 라이브러리는 pthreads입니다. 이 경우 호출 대상 오브젝트를 랩핑하는 struct을 작성하고이 struct에 대한 포인터를 정적 함수로 다시 전달할 수 있습니다.

0

AFAIK 나는 다른 방법이 있다고 생각하지 않습니다. 이 메소드를 정적으로 만들어야합니다.

관련 문제