2010-04-19 26 views
6

Ho una classe che ha funzionalità per inizializzare opengl ed eseguirlo in thread separati.Come passare la funzione membro non statico in glutDisplayFunc

Il mio problema è: i callback openGL come glutDisplayFunc, glutMotionFunc ecc accettano void (* f) void e non posso passare la funzione membro della classe.

in giro. 1) Posso dichiarare la funzione membro come statica, ma in questo caso ho bisogno di dichiarare tutte le variabili membro utilizzate come statiche e di dichiarare un'intera classe come statica.

2) Posso utilizzare una funzione autonoma e dichiarare il mio oggetto come globale, ma è troppo male.

Mi chiedo se ci sono alcuni modi per aggirare quindi non ho bisogno di rendere statico la mia classe opengl ?? (Utilizzando C++)

risposta

0

Una soluzione semplice è:

Dichiarare un puntatore globale per la classe e inizializzarlo in main (), lasciare che il callback chiamare un metodo regolare su tale istanza

MyOGLClass *g_pOGL; 

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

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

    g_pOGL = &o; 

    //... 

    glutMainLoop(); 

} 

la limitazione è che si può avere una sola istanza della classe, ma per un app OpenGL che non è così male come si ha realmente bisogno solo uno comunque ...

2

Poiché i callback non prendono alcun parametro, non c'è molto che tu possa fare. Una possibilità è creare un namespace con funzioni e un membro di dati statici che è la tua classe corrente. Le funzioni inoltrano semplicemente le chiamate di funzione alla classe esistente. Questa è fondamentalmente una versione leggermente più pulita del tuo # 2.

0

Ho appena cercato in giro per questo, dal momento che ho avuto lo stesso problema durante la pulizia e OOP'ing il nostro codice. Si scopre che le cose belle come std :: bind non funzionano qui, ma se si sta compilando su C++ 11 in ogni caso si può effettivamente definire una funzione anonima per avvolgere la funzione membro.

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

// ... 

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

Questo snippet di codice produce un 'errore:' questo 'non è stato catturato per questa funzione lambda', come posso risolvere questo problema? – wil93

+0

'errore: uso non valido della funzione membro non statico glutDisplayFunc ([]() {draw;});' –

Problemi correlati