我有一个带有实例函数(或方法?)的类。在一个实例中,我尝试将指向这些函数的指针传递给一个库。该库需要静态函数。
当我将指针传递给回调函数时,编译器提示我的函数不是静态的。我试图让它们成为静态的,但如果这样做,我就无法从函数内部访问实例字段。
我该如何解决这个问题?
类似的问题是: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/