将指向类函数的指针传递给GLUT

时间:2013-05-29 13:24:16

标签: c++ function-pointers glut

我有一个班级

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 voidvoid (App::*OnRender)()。我尝试将其定义为void &App::OnRender() {};

每次有不同的错误抱怨我的语法组合。我错过了什么。

2 个答案:

答案 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().