C++ 在GLUT中将非成员方法用作回调
我试图将函数传递给GLUT回调glutSpecialFunc 当我尝试向它传递一个静态函数(specialKeyProcessor)时,它工作得非常好 当我将此函数移动到专门处理键盘相关函数的类(KeyBoardMovement)时,它似乎不起作用: 。。。。 键盘运动键盘; .... glutSpecialFunc(键盘、specialKeyProcessor) 弹出错误:必须调用对非静态成员函数的引用C++ 在GLUT中将非成员方法用作回调,c++,oop,opengl,C++,Oop,Opengl,我试图将函数传递给GLUT回调glutSpecialFunc 当我尝试向它传递一个静态函数(specialKeyProcessor)时,它工作得非常好 当我将此函数移动到专门处理键盘相关函数的类(KeyBoardMovement)时,它似乎不起作用: 。。。。 键盘运动键盘; .... glutSpecialFunc(键盘、specialKeyProcessor) 弹出错误:必须调用对非静态成员函数的引用 我不理解这个错误,因为我看不到放在不同位置的同一个函数之间有任何区别。C++不支持闭包,这
我不理解这个错误,因为我看不到放在不同位置的同一个函数之间有任何区别。C++不支持闭包,这意味着它不能将类实例和方法一起转换为函数指针,调用该指针时将执行类实例的方法
不幸的是,GLUT不像大多数其他C回调API那样支持数据感知回调。因此,要么编写一个包装函数,调用类的全局实例,要么使用一个名为“ffcall”的库使用一些非常糟糕的技巧,该库实际上可以在运行时创建新函数,可以参数化,并充当可以传递给GLUT的闭包。但这确实是一个黑暗的东西,正确的做法是抛弃过剩。函数
glutSpecialFunc
设置每个窗口的回调。如果您使用的是OpenGLUT,它还允许您使用glutSetWindowData
将一些数据与每个窗口相关联
因此,您可以创建如下全局垫片功能:
void specialKeyProcessor(int key, int x, int y) {
KeyboardMovement *keyboard = static_cast<KeyboardMovement *>(glutGetWindowData());
keyboard->specialKeyProcessor(key, x, y);
}
如果需要存储多个窗口数据,可以存储指向特定于窗口的struct
的指针,其中包含每个特定于窗口的数据的字段
如果您不使用OpenGLUT,您可以考虑将<代码> STD::MAP< /COD>映射窗口ID设置为全局数据。然后,您可以采用与上面类似的方法来获得特定于窗口的数据。
我没有看到在中提到glutSetWindowData()
。你确定那不是FreeGLUT或OpenGLUT扩展吗?该死,这是OpenGLUT扩展。手册的那一页没有说清楚。文档确实指出,一个可行的替代方法是维护您自己从窗口ID到成员数据的映射,使用std::map
很容易做到这一点。
glutSetWindowData(static_cast<void *>(&keyboard));