Использование объектов в функции дисплея Glut - PullRequest
4 голосов
/ 19 апреля 2011

У меня проблемы с использованием объекта в перенасыщенной функции DisplayFunction.

class Modelisation
{
private:
    int hauteur, largeur, x, y;
    Camera *Cam;

    void DisplayFunction ();
    static void RedisplayFunction (int, int);

public:
    Modelisation (int argc, char **argv, char[]);
    ~Modelisation ();

    void StartMainLoop();
};

Modelisation.cpp

Modelisation::Modelisation (int argc, char **argv, char windowName [])
{
    Cam = new Camera;
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE);
    glutCreateWindow (windowName);
};
void Modelisation::StartMainLoop()
{
    glutDisplayFunc(DisplayFunction);
    glutIdleFunc(DisplayFunction);
    glutReshapeFunc(RedisplayFunction);
    glutMainLoop(); 
}
void Modelisation::DisplayFunction()
{
    glClearDepth (1);
    glClearColor (0.0f, 0.0f, 0.0f, 0.0f); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
    glLoadIdentity ();
    Cam->Render ();
    glFlush ();
    glutSwapBuffers ();
}

glutDisplayFunc (DisplayFunction); glutIdleFunc (DisplayFunction);

Это не работает. Я знаю, что могу объявить DisplayFunction как статический член, но это не позволит мне использовать Cam Object, любая идея?

Спасибо !!!

Ответы [ 3 ]

0 голосов
/ 19 апреля 2011

Вы не можете сделать это, потому что ваш void DisplayFunction (); не является статичным, и glutDisplayFunc ожидает указатель на функцию.Измените свой класс моделирования на этот:

class Modelisation
{
private:
    int hauteur, largeur, x, y;
    Camera *Cam;

    static void DisplayFunction ();
    static void RedisplayFunction (int, int);

public:
    Modelisation (int argc, char **argv, char[]);
    ~Modelisation ();

    void StartMainLoop();
};

, и он будет работать

0 голосов
/ 19 апреля 2011

То, что вы пытаетесь сделать, это, по сути, использовать нестатическую функцию-член в качестве обратного вызова C, что является одной из нелепых сложных частей C ++.

Хороший обзор того, почему это не так легко работает в C ++ 03, дан в этом вопросе StackOverflow и примерах для обхода.

0 голосов
/ 19 апреля 2011

В C ++ члены данных и методы, которые использует метод static, также должны быть объявлены static.Самый простой выход из этого - объявить Cam равным static.

Вам также придется статически инициализировать его, то есть в файле реализации:

Modelisation::Camera* Cam = new Camera();

(Обратите внимание, что, в зависимости от того, как еще используется Cam, вы можете открыть себя до фиаско статической инициализации .)

...