2011-04-24 2 views
0

glutIdleFunc에 대한 인수로 클래스 함수를 전달해야합니다. 이 구조는 작동하지 않습니다다른 클래스의 함수에서 비 정적 함수에 대한 클래스의 함수 포인터를 얻는 방법은 무엇입니까?

void (*func)(void) = this->step(); 
glutIdleFunc(func); 

이 너무 :

void (*func)(void) = Core::step(); 
glutIdleFunc(func); 

내가 어떻게 할 수 있습니까? 내 어리 석음에 대한 사과 ... :)

+0

참고 클래스에 포인터 - 투 - 멤버 함수를 호출 "*."당신은 HTTP (A [마감]를 찾고 : //en.wikipedia.org/wiki/Closure_%28computer_science%29) (대개 * lambdas *라고 함)이며 C++ 0x의 일부입니다. 자세한 내용은 [이 질문] (http://stackoverflow.com/questions/2891690/closure-and-nested-lambdas-in-c0x)을 참조하십시오. – Mehrdad

답변

5

C++에서 glutIdleFunc()에 의해 허용되는 콜백은 정적 메서드 여야합니다. 시도해보십시오 :

0

클래스의 구성원 함수에는 this라는 숨겨진 매개 변수가 있습니다.이 매개 변수는 호출하는 개체에 대한 포인터입니다. 따라서 콜백을 사용하려고 할 때 함수 시그니처가 일치하지 않을 경우이 매개 변수가 숨겨진 정적 함수를 사용해야합니다.

1

glutIdleFunc은 단순히 비 정적 멤버 함수 호출을 지원하지 않습니다. 유휴 루프에서 개체 메서드를 호출하려면 전역 변수에 개체에 대한 포인터를 배치하고 해당 전역 개체에 step 메서드를 호출하는 일반 함수 또는 정적 멤버가 있어야합니다.

이렇게 할 수있는 방법은 두 가지가 있습니다. 간단한 방법 : 약간 더 큰 캡슐화

// global scope 
Core *foo = NULL; 
void myIdleCallback() 
{ 
    foo->step(); 
} 

// when initializing, in main or whatever 
{ 
    // ... 
    foo = &theThingIWantToCall; 
    glutIdleFunc(&myIdleCallback); 
    // ... 
} 

또는 :

// work these into your Core declaration 
class Core { 
    static class Core* foo; 
    static void myIdleCallback() { 
     foo->step(); 
    } 
}; 

// at global scope 
Core *Core::foo = NULL; 

// at initialization time 
{ 
    // ... 
    Core::foo = &theThingIWantToCall; 
    // or if foo is private, add a static method to set it and call that 
    glutIdleFunc(&Core::myIdleCallback); 
    // ... 
} 
0

나는 문제가이 줄을 생각 : 무효 (* FUNC) (무효) = 코어 :: 단계() ;

함수의 서명을 void (* func) (void)로 설명하면이 함수는 C++ 함수가 아니라 C 함수의 서명입니다. C++의 모든 비 정적 멤버 메서드는 c 함수와 유사하지만 'this'에 대한 포인터 인 숨겨진 매개 변수도 있습니다.

void (Core :: * func) (void) = Core :: step();으로 서명을 변경해보십시오.

다음을 사용하여 객체의 인스턴스에서 호출 할 수 있습니다. 핵심 테스트; (test. * test.func)();

는 "f.test는"메소드의 포인터를 반환하고, 연산자는

관련 문제