4 Stimmen

Verwendung von Objekten in einer Glut-Display-Funktion

Ich habe Probleme bei der Verwendung eines Objekts in einer Glut 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();
};

Modellierung.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);

Das klappt nicht. Ich weiß, dass ich DisplayFunction als statisches Mitglied deklarieren kann, aber das erlaubt mir nicht, das Cam-Objekt zu verwenden, irgendeine Idee?

Thx !!!

0voto

Adrian Punkte 1784

In C++ werden Datenelemente und Methoden, die eine static Methode verwendet, muss ebenfalls deklariert werden static . Der einfachste Ausweg besteht darin, Folgendes zu erklären Cam zu sein static .

Sie müssen sie auch statisch initialisieren, d.h. in Ihrer Implementierungsdatei:

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

(Beachten Sie, dass, je nachdem, wie sonst Cam verwendet wird, könnten Sie sich der Gefahr aussetzen, dass die statisches Initialisierungsfiasko .)

0 Stimmen

Es tut mir leid, das zu fragen, aber wie kann ich ein statisches Objekt Cam in einer Header-Datei deklarieren?

0 Stimmen

Sie deklarieren es als static Camera* Cam; in Ihrer Header-Datei.

0 Stimmen

Entschuldigung, ich habe einen Fehler gemacht, das funktioniert perfekt. Ich bekomme immer eine perfekte Antwort, wenn ich in diesem Forum Fragen stelle. Danke !!

0voto

BЈовић Punkte 59375

Das können Sie nicht tun, weil Ihr void DisplayFunction (); ist nicht statisch, und glutDisplayFunc erwartet einen Funktionszeiger. Ändern Sie Ihre Modellierungsklasse in diese:

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();
};

und es wird funktionieren

0 Stimmen

Danke, aber das funktioniert nicht, weil mein Objekt Cam nicht statisch ist.

1 Stimmen

Sie müssen einen Funktionszeiger an glutDisplayFunc übergeben - es führt kein Weg daran vorbei

0voto

pmr Punkte 56454

Was Sie versuchen zu tun ist im Wesentlichen eine nicht-statische Member-Funktion als C-Callback, die eine der lächerlich harten Teile von C++ ist zu verwenden.

Einen guten Überblick, warum das in C++03 nicht so einfach funktioniert, gibt es in diese StackOverflow-Frage und Beispiele zum Nacharbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X