У меня есть класс, который имеет функциональность, чтобы инициализировать opengl и выполнить его в отдельном потоке.
Моя проблема: обратные вызовы openGL, такие как glutDisplayFunc, glutMotionFunc и т.д. принимает пустой (*f) пусто, и я не могу передать функцию членства класса.
пути вокруг. 1) я могу объявить функцию членства, столь же статичную, но в этом случае я должен объявить все используемые членские переменные, столь же статичные, и закончить тем, что объявил целый класс как помехи.
2) Я могу использовать некоторую одинокую функцию и объявить мой объект как глобальный, но его слишком плохое.
Интересно, существуют ли некоторые пути вокруг, таким образом, я не должен делать свой opengl класс статичным?? (использующий C++)
Вам нужно будет создать «преобразователь» или «трамплин»: Обратные вызовы функции C API в код функции-члена C ++
Простое решение:
Объявите глобальный указатель на свой класс и инициализируйте его в main (), позвольте обратному вызову вызывать обычный метод для этого экземпляра
MyOGLClass *g_pOGL;
void oglDraw()
{
if(g_pOGL)
g_pOGL->oglDraw();
}
void main()
{
// Init your class
MyOGLClass o;
g_pOGL = &o;
//...
glutMainLoop();
}
Ограничение в том, что у вас может быть только один экземпляр вашего класса, но для приложения OpenGL, которое не Так плохо, что вам действительно нужен только один ...
Поскольку обратные вызовы не брать любые параметры, тут мало что можно сделать. Одна из возможностей - создать пространство имен с функциями и статическим членом данных, который является вашим текущим классом. Функции будут просто перенаправлять вызовы функций существующему классу. Это просто немного более чистая версия вашего №2.
namespace GLForwader
{
static MyGLClass* = new myGlClass();
void glutDisplayFunc() {myGlClass->glutDisplayFunc();}
void glutMotionFunc() {myGlClass->glutMotionFunc();}
}