Ответ 1
Проблема заключается в том, что указатель на связанную с экземпляром функцию-член должен включать указатель this
. OpenGL - это API C и ничего не знает о указателях this
. Вам нужно будет использовать статическую функцию-член (для которой не требуется экземпляр и, следовательно, нет this
), и установите некоторые статические члены данных (чтобы получить доступ к экземпляру), чтобы использовать glutDisplayFunc
.
class myPixmap
{
private:
static myPixmap* currentInstance;
static void drawCallback()
{
currentInstance->draw();
}
void setupDrawCallback()
{
currentInstance = this;
::glutDisplayFunc(myPixmap::drawCallback);
}
};
У вас могут также возникнуть проблемы с C linkage vs С++ linkage, и в этом случае вам придется играть с extern "C"
. Если это так, возможно, вам придется использовать глобальную функцию, а не статическую функцию-член как ваш обратный вызов, и иметь этот вызов myPixmap::draw
. Что-то вроде:
class myPixmap
{
public:
void draw();
private:
void setupDrawCallback();
};
myPixmap* g_CurrentInstance;
extern "C"
void drawCallback()
{
g_CurrentInstance->draw();
}
void myPixmap::setupDrawCallback();
{
::g_CurrentInstance = this;
::glutDisplayFunc(::drawCallback);
}
Со всем этим старайтесь сделать как можно меньше изменений, так как это действительно своего рода kludge для работы с OpenGL, являющимся C API.
Если вам нужны несколько экземпляров (я не думаю, что большинство людей, использующих GLUT, делают несколько экземпляров, но, может быть, и есть), вам нужно выяснить решение с помощью std:: map для извлечения экземпляра:
static std::map<int, myPixmap> instanceMap;
Если вы получили int
, чтобы разрешить этот экземпляр, я не уверен:)
FYI, вы должны определить функции, которые не принимают никаких параметров таким образом:
void some_function() { }
не
void some_function(void) { }