Чтобы передать указатель на функцию-член

У меня есть класс с функциями экземпляра (или методы?). Внутри экземпляра я пытаюсь передать указатели на эти функции в библиотеку. Библиотека ожидает статические функции.

Когда я передаю свои указатели на функции обратного вызова, компилятор жалуется, что мои функции не являются статичными. Я пытался сделать их статичными, но если я это сделаю, то я не смогу получить доступ к полям экземпляра из функций.

Как я мог обойти это?

Подобный вопрос:Использование функции-члена класса C ++ в качестве функции обратного вызова C где предлагают ставить метод статично. Однако я не могу этого сделать, или я не вижу, как я мог.

Code
GlutController::GlutController (int argc, char **argv) {

   // stuff ..

   // Register callbacks
   glutSpecialFunc( OnSpecialKeys );  // Error, need static functions
   glutReshapeFunc( OnChangeSize );   // Error...
   glutDisplayFunc( OnRenderScene );  // Error...

   // stuff ..
}

GlutController::~GlutController() {

}

void GlutController::OnChangeSize(int aNewWidth, int aNewHeight){

   glViewport(0,0,aNewWidth, aNewHeight);
   mViewFrustrum.SetPerspective( APP_CAMERA_FOV,             // If this function is 
            float( aNewWidth ) / float( aNewHeight ),        // static, this won't 
            APP_CAMERA_NEAR,                                 // work
            APP_CAMERA_FAR );
   mProjectionMatrixStack.LoadMatrix(                        // Same here
            mViewFrustrum.GetProjectionMatrix() );
   mTransformPipeline.SetMatrixStacks(mModelViewMatrixStack, // Same here  
            mProjectionMatrixStack);

}

void GlutController::OnRenderScene(void){
   mGeometryContainer.draw();                                // Won't work if static
}

void GlutController::OnSpecialKeys(int key, int x, int y){
   mGeometryContainer.updateKeys(key);                       // Won't work if static
}

Disclaimer : I just begun C++. I read all of Accelerated C++ and this is my first project to try out the language. My background is in Java.

Ответы на вопрос(4)

Ваш ответ на вопрос