Как передать не статическую функцию членства в glutDisplayFunc

У меня есть класс, который имеет функциональность, чтобы инициализировать opengl и выполнить его в отдельном потоке.

Моя проблема: обратные вызовы openGL, такие как glutDisplayFunc, glutMotionFunc и т.д. принимает пустой (*f) пусто, и я не могу передать функцию членства класса.

пути вокруг. 1) я могу объявить функцию членства, столь же статичную, но в этом случае я должен объявить все используемые членские переменные, столь же статичные, и закончить тем, что объявил целый класс как помехи.

2) Я могу использовать некоторую одинокую функцию и объявить мой объект как глобальный, но его слишком плохое.

Интересно, существуют ли некоторые пути вокруг, таким образом, я не должен делать свой opengl класс статичным?? (использующий C++)

6
задан genpfault 12 June 2014 в 14:04
поделиться

3 ответа

Вам нужно будет создать «преобразователь» или «трамплин»: Обратные вызовы функции C API в код функции-члена C ++

4
ответ дан 17 December 2019 в 02:25
поделиться

Простое решение:

Объявите глобальный указатель на свой класс и инициализируйте его в main (), позвольте обратному вызову вызывать обычный метод для этого экземпляра

MyOGLClass *g_pOGL;

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

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

    g_pOGL = &o;

    //...

    glutMainLoop();

}

Ограничение в том, что у вас может быть только один экземпляр вашего класса, но для приложения OpenGL, которое не Так плохо, что вам действительно нужен только один ...

0
ответ дан 17 December 2019 в 02:25
поделиться

Поскольку обратные вызовы не брать любые параметры, тут мало что можно сделать. Одна из возможностей - создать пространство имен с функциями и статическим членом данных, который является вашим текущим классом. Функции будут просто перенаправлять вызовы функций существующему классу. Это просто немного более чистая версия вашего №2.

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

    void glutDisplayFunc() {myGlClass->glutDisplayFunc();}
    void glutMotionFunc() {myGlClass->glutMotionFunc();}
}
2
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: