我有一个班级
class App {
private:
float angle;
public:
App();
int OnExecute();
void OnLoop();
void OnRender();
bool OnInit();
void OnCleanup();
};
//In my cpp file:
int App::OnExecute() {
if (OnInit() == false) {
return -1;
}
OnLoop();
OnRender();
OnCleanup();
return 0;
}
bool App::OnInit() {
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowPosition(-1,-1);
glutInitWindowSize(1024,768);
glutCreateWindow("D&D VT");
glutDisplayFunc(Render); //Why can't I put this->OnRender
//glutReshapeFunc(changeSize);
//glutIdleFunc(Render);
return true;
}
我评论说我正在努力做我想做的事情。我想传递一个指向我的类函数的指针。我已经尝试了4种不同的方法来做到这一点,除非我创建一个非类函数来传递,否则我总是得到编译错误。
我尝试过this->*OnRender
。
我尝试将该函数声明为virtual void
和void (App::*OnRender)()
。我尝试将其定义为void &App::OnRender() {};
。
每次有不同的错误抱怨我的语法组合。我错过了什么。
答案 0 :(得分:1)
glutDisplayFunc(Render); //Why can't I put this->OnRender
但是,C和C ++不能那样工作。你在想什么就是所谓的闭包。 this->Render
是结合了两个不同元素的语法糖:
和
两者必须以特定方式组合才能被解除引用。在C ++中,您可以编写一个回调函数,它接受两个参数(指向类实例this
的指针和指向类成员&App::Render
的指针)但是 GLUT 这是您正在使用的框架用C语言写的,它的API是C.而且C不知道类,它不知道类成员,所以你尝试做的事情几乎是不可能实现而不做疯狂的事情,比如使用 ffcall 在原位创建闭包。
我的建议:不要使用GLUT。 GLUT只是一些框架,您可以随时替换它。使用Qt怎么样?它有适当的OpenGL支持,如果你想做所有的C ++ OOP,它可以更好地工作。
答案 1 :(得分:0)
解决这一难题的关键在于这3个GLUT
函数。
int glutCreateWindow(char *name);
void glutSetWindow(int win);
int glutGetWindow(void);
没有窗口,您无法显示任何内容,您可以查询窗口。因此,您需要将此窗口int
与指向您想要的任何内容的指针相关联:指向实例或某个结构的指针,无论您喜欢什么。例如:
static ::std::unordered_map<int, Window*> windows;
extern "C" void display_callback()
{
auto const window_id(glutGetWindow());
windows[window_id]->do_something();
}
如果您使用freeglut
,请查看以下功能:
glutGetWindowData()
glutSetWindowData().