2010-04-19 12 views
6

übergeben Ich habe eine Klasse, die Funktionalität hat, OpenGL zu initialisieren und in separaten Thread ausführen.Wie nicht-statische Member-Funktion in glutDisplayFunc

Mein Problem ist: openGL Rückrufe wie glutDisplayFunc, glutMotionFunc usw. akzeptiert void (* f) void, und ich kann nicht Klassenmitgliedsfunktion übergeben.

Wege herum. 1) Ich kann Memberfunktion als statisch deklarieren, aber in diesem Fall muss ich alle verwendeten Membervariablen als statisch deklarieren und am Ende eine ganze Klasse als statisch deklarieren.

2) Ich kann einige eigenständige Funktion verwenden und mein Objekt als global deklarieren, aber es ist zu schlecht.

Ich frage mich, ob es einige Möglichkeiten gibt, so muss ich meine OpenGL-Klasse nicht statisch machen ?? (Mit C++)

Antwort

0

Eine einfache Abhilfe ist:

Deklarieren Sie einen globalen Zeiger auf Ihre Klasse und initialisieren es in main (), lassen auf diese Instanz der Rückruf

MyOGLClass *g_pOGL; 

void oglDraw() 
{ 
    if(g_pOGL) 
     g_pOGL->oglDraw(); 
} 

void main() 
{ 
    // Init your class 
    MyOGLClass o; 

    g_pOGL = &o; 

    //... 

    glutMainLoop(); 

} 

die Begrenzung eine reguläre Methode nennen, ist nur eine Instanz der Klasse haben, aber für eine OpenGL-Anwendung, die, wie Sie wirklich brauchen nicht so schlimm ist ohnehin nur ...

2

Da die Rückrufe keine Parameter annehmen, können Sie nicht viel tun. Eine Möglichkeit besteht darin, einen Namespace mit Funktionen und einem statischen Datenelement zu erstellen, das Ihre aktuelle Klasse ist. Die Funktionen würden die Funktionsaufrufe nur an die vorhandene Klasse weiterleiten. Dies ist nur im Grunde eine etwas sauberere Version Ihrer # 2.

0

Ich habe gerade nach diesem gesucht, da ich das gleiche Problem beim Aufräumen und OOP unseren Code hatte. Es stellt sich heraus, dass das nette Zeug wie std :: bind hier nicht funktioniert, aber wenn Sie sowieso auf C++ 11 kompilieren, können Sie eine anonyme Funktion definieren, um Ihre Elementfunktion zu umbrechen.

class Renderer { 
    void Start(); 
    void Render(); 
} 

// ... 

void Renderer::Start() { 
    // ... 
    glutDisplayFunc([](){ Render(); }); 
} 
+0

Dieses Code-Snippet erzeugt einen 'Fehler: 'das' wurde für diese Lambda-Funktion nicht erfasst ', wie behebe ich das? – wil93

+0

'Fehler: ungültige Verwendung der nicht statischen Elementfunktion glutDisplayFunc ([]() {draw;});' –

Verwandte Themen