Как правильно передать метод void Object::displayInfo() в функцию void glutDisplayFunc(void (*func)())?
Библиотека glut
Использовал следующие варианты, и оба нерабочие:(
Вариант№1:
glutDisplayFunc(&object.displayInfo());
Вариант№2:
void (*pt_to_displayInfo)(void) = NULL;
pt_to_displayInfo= &object.displayInfo;
glutDisplayFunc(void (*pt_to_displayInfo)(void));
Код (если нужен):
class Object
{
public:
Object(std::string s)
{
name = s;
}
~Object() {}
std::string getName()
{
return name;
}
void displayInfo()
{
drawText(10.0, 10.0);
}
void drawText(GLdouble x, GLdouble y)
{
glColor3f(1.0, 0.0, 0.0);
glRasterPos2f(x, y);
for (int i = 0; i < name.size(); ++i)
{
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, (name[i]));
}
}
private:
std::string name;
};
int main(int argc, char* argv[])
{
Object object = Object("HI!");
//Initialise GLUT with command-line parameters.
glutInit(&argc, argv);
//Set Display Mode
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//Set the window size
glutInitWindowSize(250, 250);
//Set the window position
glutInitWindowPosition(100, 100);
//Create the window
glutCreateWindow("A Simple OpenGL Windows Application with GLUT");
//Call "display" function
//ПРОБЛЕМНОЕ МЕСТО(start)
/*
void (*pt_to_displayInfo)(void) = NULL;
pt_to_displayInfo = &object.displayInfo;
glutDisplayFunc(void (*pt_to_displayInfo)(void));
//glutDisplayFunc(&object.displayInfo());
*/
//ПРОБЛЕМНОЕ МЕСТО(end)
//Enter the GLUT event loop
glutMainLoop();
return 0;
}
Ответы (2 шт):
Автор решения: punchel
→ Ссылка
Здесь ты не можешь передавать указатели на методы классов. Сделай displayInfo статической, можешь даже внутри displayInfo обращаться к методам Object, если это синглтон.
Автор решения: AR Hovsepyan
→ Ссылка
Функция glutDisplayFunc принимает указатель на обычную функцию, а функцию_член объекта нельзя передавать как свободную функцию, она связанf с объектом и неявно имеет аргумент(указатель this). Поэтому, если displayInfo
не должен быть статическим членом, то код нужно выполнить в функции( может быть и лямбдой), а потом передать указатель на эту функцию как аргумент целевой функции:
auto foo = []()
{
Object object;
void (Object :: * pt_to_displayInfo)() = &Object::displayInfo;
// вызвать так
(object.*pt_to_displayInfo)();
//нужно смотреть есть ли смысл в объявлении указателья
//или просто вызвать Object.displayInfo()?
};
glutDisplayFunc(foo);