这是我遇到问题的代码的简短版本,它不应该能够编译。
#include <gl/freeglut.h>
class i{
//something
};
void Keyboard(int value){
/*
*/
bool key[256];
if( key['Something'] == true)
Class.Something ++;
glutTimerFunc(33,Keyboard,0);
}
int main(int argc, char **argv){
Installwindow();
i Class;
glutTimerFunc(33,Keyboard,0);
otheropenglstuff();
}
我遇到的问题是我无法使键盘无效(我上课); 因为那时它会在glutTimerfunc上出错。我也有 glutDisplayFunc(RenderScene)的这个问题;那还有另一种方法吗? 将数据转化为另一个功能而不让它们成为全球性的?我试图解决这个问题 通过使用类,但我在glutTimerFunc上得到另一个错误。
答案 0 :(得分:1)
那么还有另一种方法可以将数据转化为另一种功能,而不必让它们成为全局数据吗?
像其他人已经建议的那样:不要使用GLUT。 GLUT从未被认为是认真应用的基础。这是一个小型框架,适用于小型OpenGL技术演示。您遇到的问题是C和C ++缺少一个名为“闭包”的概念,有时也称为“委托”。其他语言也有它们,实际上当你在这些语言中使用GLUT绑定时,你不会遇到这个问题。
由于C / C ++缺少闭包是如此突出,因此编写了一个小型库(在内部做了疯狂但天才的事情),允许它在C中创建闭包。它被称为 ffcall ,遗憾的是,似乎没有维护,但是作为GNU Common Lisp和Scheme编译器的项目正在使用它。
我写过关于在StackOverflow答案中使用ffcall https://stackoverflow.com/a/8375672/524368和https://stackoverflow.com/a/10207698/524368
答案 1 :(得分:0)
你可以使用一个技巧:在将对象转换为int:
之后,将指针作为值传递给对象i instance;
keyboard((int)&i);
如果需要使用定时器调用该函数,请考虑这样一个事实:当函数结束时,堆栈中的所有对象都被释放。因此,在这种情况下,您应该使用new分配对象,并且在需要解除分配时始终具有句柄。
我知道这很棘手。如果你可以切换到另一个库那么做。