传递指向成员函数的指针

Ant*_*neG 5 c++ glut member-function-pointers function-pointers freeglut

我有一个具有实例函数(或方法?)的类.在一个实例中,我尝试将指向这些函数的指针传递给库.该库需要静态函数.

当我将指针传递给回调函数时,编译器会抱怨我的函数不是静态的.我试图将它们设为静态,但如果我这样做,那么我就无法从函数中访问实例字段.

我怎么能绕过这个?

类似的问题是:使用C++类成员函数作为C回调函数,他们建议将方法设置为静态.但是我做不到,或者我不知道我怎么做.

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
}
Run Code Online (Sandbox Code Playgroud)

免责声明:我刚开始使用C++.我阅读了所有Accelerated C++,这是我尝试该语言的第一个项目.我的背景是Java.

Sha*_*baz 7

你想要做的是不可能的.这glut实际上是错的.

事情是这样的:

  • glut 想要调用函数,而不给它数据,
  • 您希望您的函数使用一些数据,

这是相互冲突的需求.我相信glut你决定可以安全地使用全局变量.

因此,一种解决方案是使用静态函数和静态数据.或者更好的解决方案是切换到SDL.

  • 任何开发不能使用用户定义参数的不透明库函数的人(例如,用于回调)都应该被解雇,提升到营销/销售或者给予竞争对手公司工作的经济激励. (2认同)