Как правильно передать метод 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);
→ Ссылка