使用非成员方法作为GLUT中的回调
Use non-member method as a callback in GLUT
我正试图将一个函数传递给GLUT回调glutSpecialFunc。
当我试图将一个静态函数(specialKeyProcessor)传递给它时,它工作得很好
当我把这个函数移到一个专门处理键盘相关函数的类(KeyBoardMovement)上时,它似乎不起作用:
键盘移动键盘;。。。。glutSpecialFunc(keyboard.specialKeyProcessor);
弹出错误:必须调用对非静态成员函数的引用。
我不理解这个错误,因为我看不出同一个函数放在不同的地方有什么区别。
glutSpecialFunc
函数设置每个窗口的回调。如果您使用OpenGLUT,它还允许您使用glutSetWindowData
将一些数据与每个窗口关联起来。
因此,您可以制作这样的全局填充函数:
void specialKeyProcessor(int key, int x, int y) {
KeyboardMovement *keyboard = static_cast<KeyboardMovement *>(glutGetWindowData());
keyboard->specialKeyProcessor(key, x, y);
}
并使用glutGetWindowData
:关联您的键盘处理程序
glutSetWindowData(static_cast<void *>(&keyboard));
如果需要存储多个窗口数据,可以存储一个指向特定于窗口的struct
的指针,该指针包含每个特定于窗口数据的字段。
如果您不使用OpenGLUT,可以考虑使用std::map
将窗口ID映射到全局数据。然后,您可以采用与上面类似的方法来获得特定于窗口的数据。
C++不支持闭包,这意味着它不能将类实例和方法一起转换为函数指针,当被调用时,函数指针将执行类实例的方法。
不幸的是,GLUT不像大多数其他C回调API那样支持数据感知回调。因此,它要么编写一个包装函数,它将调用类的全局实例,要么使用一个名为"ffcall"的库来使用一些非常肮脏的技巧,它实际上可以在运行时创建新的函数,这些函数可以被参数化,并作为一个可以传递给GLUT的闭包。但这真的很黑暗,正确的做法是抛弃GLUT。
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 如何使用GLUT的回调操作数据
- GLUT回调方法问题
- GLUT回调函数的问题
- GLUT只运行一次显示回调,不输出到终端
- 使用非成员方法作为GLUT中的回调
- 在 GLUT 中切换显示回调