2010-04-19 26 views
6

Tengo una clase que tiene la funcionalidad para inicializar OpenGL y ejecutarlo en un hilo separado.Cómo pasar la función de miembro no estático a glutDisplayFunc

Mi problema es: las devoluciones de llamada openGL como glutDisplayFunc, glutMotionFunc etc. aceptan void (* f) void, y no puedo pasar la función de miembro de clase.

formas alrededor. 1) Puedo declarar la función de miembro como estática, pero en este caso necesito declarar todas las variables de miembro usadas como estáticas y terminar declarando una clase completa como estática.

2) Puedo usar alguna función independiente y declarar mi objeto como global, pero es una lástima.

Me pregunto si hay algunas formas, ¿por qué no necesito hacer que mi clase opengl estética? (Usando C++)

Respuesta

0

Una solución sencilla es:

declarar un puntero global para su clase y inicializarlo en main (), deje que la devolución de llamada llama a un método regular en esa instancia

MyOGLClass *g_pOGL; 

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

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

    g_pOGL = &o; 

    //... 

    glutMainLoop(); 

} 

la limitación es que puede tener sólo una instancia de la clase, pero para una aplicación OpenGL que no es tan malo como lo que realmente necesita sólo una de todas formas ...

2

Dado que las devoluciones de llamada no toman ningún parámetro, no hay mucho que pueda hacer. Una posibilidad es crear un espacio de nombres con funciones y un miembro de datos estáticos que sea su clase actual. Las funciones simplemente reenviarían las llamadas de función a la clase existente. Esto es básicamente una versión ligeramente más limpia de su # 2.

namespace GLForwader 
{ 
    static MyGLClass* = new myGlClass(); 

    void glutDisplayFunc() {myGlClass->glutDisplayFunc();} 
    void glutMotionFunc() {myGlClass->glutMotionFunc();} 
} 
0

Acabo de buscar alrededor de esto, ya que tuve el mismo problema al limpiar y OOP'ear nuestro código. Resulta que las cosas buenas como std :: bind no funcionan aquí, pero si compila en C++ 11 de todos modos, puede definir una función anónima para ajustar su función de miembro.

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

// ... 

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

Este fragmento de código produce un 'error: 'esto' no fue capturado para esta función lambda', ¿cómo puedo arreglar esto? – wil93

+0

'error: uso no válido de la función miembro no estática glutDisplayFunc ([]() {draw;});' –

Cuestiones relacionadas