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 オブジェクトを使用できません。

どうも !!!

4

3 に答える 3

0

あなたがやろうとしているのは、本質的に非静的メンバー関数を C コールバックとして使用することです。これは、C++ のばかげた難しい部分の 1 つです。

これが C++03 で簡単に機能しない理由の概要については、この StackOverflow の質問と回避策の例を参照してください。

于 2011-04-18T22:42:20.863 に答える
0

C++ では、メソッドが使用するデータ メンバーとメソッドstaticも宣言する必要がありますstatic。これを回避する最も簡単な方法は、 であると宣言Camすることstaticです。

また、静的に、つまり実装ファイルで初期化する必要があります。

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

(else の使用方法によっては、静的初期化の大失敗Camに直面する可能性があることに注意してください。)

于 2011-04-18T21:47:18.533 に答える
0

あなたは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();
};

そしてそれはうまくいく

于 2011-04-18T22:07:02.213 に答える