c++ - 将指针传递给成员函数

标签 c++ function-pointers glut pointer-to-member freeglut

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

当我将指针传递给回调函数时,编译器提示我的函数不是静态的。我试图让它们成为静态的,但如果这样做,我就无法从函数内部访问实例字段。

我该如何解决这个问题?

类似的问题是:Using a C++ class member function as a C callback function他们建议将方法放在静态的地方。但是我不能那样做,或者我不明白我该怎么做。

代码

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
}

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

最佳答案

你想做的事是不可能的。这实际上是 glut 的错。

事情是这样的:

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

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

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

关于c++ - 将指针传递给成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792664/

相关文章:

c++ - 没有执行策略的 std::transform_reduce 是否可移植?

c++ - 函数模板实例的地址可以作为函数指针传递给某个函数吗?

c++ - OpenGL/GLUT - 大量 undefined reference

c - 关于 OpenGL 中的旋转

c++ - 调试例程 MSVC++ 是否特定?

c++ - C++十进制转十六进制代码

c++ - 如果表面被锁定,访问 SDL_Surface 的俯仰数据成员是否安全?

c - 每个 C 标准中带有空括号的函数指针的语义是什么?

fortran - 在派生类型之间传递 Nopass 过程指针导致段错误

c++ - glCreateShader 上的 GLUT 段错误