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