2011-04-18 6 views
4

glut DisplayFunctionでオブジェクトを使用する際に問題があります。オブジェクトをglut表示関数に使用

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

ヘッダファイルに 'static Camera * 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

ありがとうございます、しかし、私のオブジェクトカムは静的ではないので、これは動作していません。 – Athanase

+1

glutDisplayFuncへの関数ポインタを渡す必要があります。 –

0

に動作しますとんでもないハードの一つであるCコールバック、などの非静的メンバ関数を使用することが本質的ですC++の一部です。

これはC++で簡単に動作しない理由の概要です。03はthis StackOverflow questionで、回避するには例を示しています。

関連する問題