如何将非静态成员函数传递给glutDisplayFunc

时间:2010-04-19 20:11:39

标签: c++ opengl static

我有一个类,它具有初始化opengl的功能并在单独的线程中运行它。

我的问题是:诸如glutDisplayFunc,glutMotionFunc等openGL回调接受 void(* f)void,我无法传递类成员函数。

周围的方式。 1)我可以将成员函数声明为static,但在这种情况下,我需要将所有使用过的成员变量声明为static,并最终将整个类声明为static。

2)我可以使用一些独立的功能并将我的对象声明为全局,但它太糟糕了。

我想知道是否有一些方法,所以我不需要让我的opengl类静态? (使用c ++)

4 个答案:

答案 0 :(得分:4)

你需要创建一个“thunk”或“trampoline”:C API function callbacks into C++ member function code

答案 1 :(得分:2)

由于回调不带任何参数,因此您无能为力。一种可能性是创建一个带有函数的命名空间和一个静态数据成员,它是您当前的类。这些函数只是将函数调用转发给现有的类。这基本上只是你#2的一个稍微清洁的版本。

namespace GLForwader
{
    static MyGLClass* = new myGlClass();

    void glutDisplayFunc() {myGlClass->glutDisplayFunc();}
    void glutMotionFunc() {myGlClass->glutMotionFunc();}
}

答案 2 :(得分:0)

一个简单的解决方法是:

声明一个指向类的全局指针并在main()中初始化它,让回调调用该实例上的常规方法

MyOGLClass *g_pOGL;

void oglDraw()
{
    if(g_pOGL)
        g_pOGL->oglDraw();
}

void main()
{
    // Init your class
    MyOGLClass o;

    g_pOGL = &o;

    //...

    glutMainLoop();

}

限制是你只能有一个类的实例,但对于一个不那么糟糕的OpenGL应用程序,你真的只需要一个...

答案 3 :(得分:0)

我刚刚搜索过这个,因为我在清理和OOP代码时遇到了同样的问题。事实证明,像std :: bind这样的好东西在这里不起作用,但如果你在C ++ 11上进行编译,你实际上可以定义一个匿名函数来包装你的成员函数。

class Renderer {
  void Start();
  void Render();
}

// ...

void Renderer::Start() {
  // ...
  glutDisplayFunc([](){ Render(); });
}