Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在GLUT中将非成员方法用作回调_C++_Oop_Opengl - Fatal编程技术网

C++ 在GLUT中将非成员方法用作回调

C++ 在GLUT中将非成员方法用作回调,c++,oop,opengl,C++,Oop,Opengl,我试图将函数传递给GLUT回调glutSpecialFunc 当我尝试向它传递一个静态函数(specialKeyProcessor)时,它工作得非常好 当我将此函数移动到专门处理键盘相关函数的类(KeyBoardMovement)时,它似乎不起作用: 。。。。 键盘运动键盘; .... glutSpecialFunc(键盘、specialKeyProcessor) 弹出错误:必须调用对非静态成员函数的引用 我不理解这个错误,因为我看不到放在不同位置的同一个函数之间有任何区别。C++不支持闭包,这

我试图将函数传递给GLUT回调glutSpecialFunc

当我尝试向它传递一个静态函数(specialKeyProcessor)时,它工作得非常好

当我将此函数移动到专门处理键盘相关函数的类(KeyBoardMovement)时,它似乎不起作用:

。。。。 键盘运动键盘; .... glutSpecialFunc(键盘、specialKeyProcessor)

弹出错误:必须调用对非静态成员函数的引用


我不理解这个错误,因为我看不到放在不同位置的同一个函数之间有任何区别。

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));