2014-05-21 3 views
1

kinect 응용 프로그램에서 C + +,하지만 내 glut 기능, void glutKeyboard, glutDisplay, glutIdle 같은 오류가 있습니다. 다음 예제에서는 모든 함수가 기본 파일에서 선언되므로 클래스가 필요하지 않지만 내 응용 프로그램에서는 클래스가 함수의 범위를 선언하여 오류를 생성합니다.'void (classname :: unsigned char, int, int)'형식으로 'classname :: glutKeyboard'를 'void (classname ::) (unsigned char, int, int)'형식으로 변환 할 수 없습니다.

이와 함수 헤더의 선언 :

class VideoOpenGL : public QGLWidget 
{ 
    Q_OBJECT 
public: 
    explicit VideoOpenGL(QWidget *parent = 0); 

protected: 
    // /* 
    void initializeGL(); 
    //void resizeGL(int w, int h); 
    //void paintGL(); 
    void glutKeyboard (unsigned char key, int /*x*/, int /*y*/); 
    void glutDisplay(void); 
    void glutIdle (void); 
    void CleanupExit(); 
    void LoadCalibration(); 
    void SaveCalibration(); 
    // */ 
signals: 

public slots: 

}; 

이것은 기능 내 기능 glutKeyboard

void VideoOpenGL::glutKeyboard (unsigned char key, int /*x*/, int /*y*/) 
{ 
    switch (key) 
    { 
    case 27: 
     CleanupExit(); 
    case 'b': 
     // Draw background? 
     g_bDrawBackground = !g_bDrawBackground; 
     break; 
    case 'x': 
     // Draw pixels at all? 
     g_bDrawPixels = !g_bDrawPixels; 
     break; 
    case 's': 
     // Draw Skeleton? 
     g_bDrawSkeleton = !g_bDrawSkeleton; 
     break; 
    case 'i': 
     // Print label? 
     g_bPrintID = !g_bPrintID; 
     break; 
    case 'l': 
     // Print ID & state as label, or only ID? 
     g_bPrintState = !g_bPrintState; 
     break; 
    case 'f': 
     // Print FrameID 
     g_bPrintFrameID = !g_bPrintFrameID; 
     break; 
    case 'j': 
     // Mark joints 
     g_bMarkJoints = !g_bMarkJoints; 
     break; 
    case'p': 
     g_bPause = !g_bPause; 
     break; 
    case 'S': 
     SaveCalibration(); 
     break; 
    case 'L': 
     LoadCalibration(); 
     break; 
    } 
} 

지금 호출입니다

glutKeyboardFunc(glutKeyboard); 

답변

1

glutKeyboardFunc() 지정된 콜백 독립형 함수가 될 것으로 예상,하지만 당신은 때문에 알지 못하는 과잉 숨겨진 this 매개 변수의 호환되지 않습니다하는 대신 비 정적 클래스 메소드를 지정하고 있습니다. 따라서 오류.

  1. VideoOpenGL 클래스 제거하고 glutKeyboard() 독립형 함수가 될 수 있도록하기 :

    당신은 세 가지 선택이있다.

  2. glutKeyboard()을 으로 지정하고 this 매개 변수를 제거하십시오. 이는 glutKeyboard()이 더 이상 VideoOpenGL 클래스의 비 정적 멤버에 직접 액세스 할 수 없음을 의미합니다. glutKeyboardFunc()glutKeyboard()에 사용자 정의 값을 전달할 수 없으므로 VideoOpenGL 개체를 가리키는 자신의 전역 VideoOpenGL* 포인터를 선언해야합니다. 그런 다음 해당 포인터를 통해 비 정적 구성원에 액세스 할 수 있습니다.

  3. glutKeyboardFunc()을 호출하고 해당 작업을 VideoOpenGL 개체에 내부적으로 위임하도록 호환 가능한 인터페이스를 구현하는 프록시 썽크를 만듭니다.

+0

감사합니다. – user3651443

0

변경

void glutKeyboard (unsigned char key, int /*x*/, int /*y*/); 

정적 멤버 함수에 원하는대로 사용하려는 경우.

static void glutKeyboard (unsigned char key, int /*x*/, int /*y*/); 
관련 문제