2011-04-18 2 views
4

У меня возникли проблемы с использованием объекта в перенасыщении 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, любую идею?

Thx !!!

ответ

0

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

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

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

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

+0

Прошу прощения, но как объявить статический объект Cam в файле заголовка? – Athanase

+0

Вы объявляете его как «статическую камеру» Cam, 'в своем заголовочном файле. – Adrian

+0

Извините, я ошибся, это прекрасно работает. Я всегда получаю прекрасный ответ, когда задаю вопросы на этом форуме. Спасибо !! – Athanase

0

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

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

Спасибо, но это не работает, потому что мой объект Cam не статичен. – Athanase

+1

вам нужно передать указатель на функцию glutDisplayFunc - никоим образом не вокруг –

0

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

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

Смежные вопросы