herencia - codigo de clases en c++
¿Cómo pasar un método de clase como argumento para otra función en C++ y OpenGL? (5)
En primer lugar, hay un puntero "este" implícito en las funciones miembro no estáticas, por lo que tendrá que cambiar su void myDisplay()
en ClassBlah
para que sea estático. Es incómodo evitar esta limitación, por lo que el faq Lite de C ++ dice que no lo hagas
Entonces, debería poder pasar las funciones como ClassBlah::myDisplay
.
Dependiendo de su motivación para la sobrecarga (es decir, ¿va a entrar y salir implementaciones de hotswap en tiempo de ejecución, o solo en tiempo de compilación?) Puede considerar una clase estática "manejadora" de utilidad que contiene un puntero a su clase base y delega responsabilidades a través de ese.
Sé que esto funciona:
void myDisplay()
{
...
}
int main()
{
...
glutDisplayFunc(myDisplay)
...
}
así que traté de incluir la función myDisplay () en una clase que hice. Porque quiero sobrecargarlo en el futuro con una clase diferente. Sin embargo, el compilador se queja de que
argument of type ''void (ClassBlah::)()'' does not match ''void(*)()'' .
Aquí está lo que intento hacer:
class ClassBlah
{
....
void myDisplay()
....
}
......
int main()
{
...
ClassBlah blah
glutDisplayFunc(blah.myDisplay)
...
}
¿Alguien sabe cómo solucionar este problema? Muchas gracias.
Me encontré con este problema escribiendo un motor C ++ Glut. Así es como trabajé alrededor de esto:
Coloqué estos en la parte superior de mi programa.cpp / main.cpp
// Function prototypes
void doRendering( void );
void processMouse( int, int ) ;
void processMouseClick(int button, int state, int x, int y);
void keyboardInput(unsigned char c, int x, int y);
Asigna estas funciones a las devoluciones de llamadas de glut aquí:
glutDisplayFunc(doRendering);
glutIdleFunc(doRendering);
glutPassiveMotionFunc(processMouse);
glutMotionFunc(processMouse);
glutMouseFunc(processMouseClick);
glutKeyboardFunc(keyboardInput);
Crear mi propia clase que maneja esto por sí misma y luego hacer que el contenido de nuestras funciones estáticas simplemente invoque métodos en la instancia de esta clase. Tu función principal debería crear una nueva instancia de la clase en main (en mi caso ... App * newApp).
void doRendering( void )
{
newApp->updateScene();
newApp->drawScene();
}
void processMouse(int x, int y)
{
newApp->processMouse(x, y);
}
void processMouseClick(int button, int state, int x, int y)
{
newApp->processMouseClick(button, state, x, y);
}
void keyboardInput(unsigned char c, int x, int y)
{
newApp->keyboardInput(c, x, y);
}
Espero que lo explique.
No puedes. glutDisplayFunc
toma un parámetro de tipo void(*)()
, no void (ClassBlah::)()
. A menos que esté dispuesto y sea capaz de alterar la fuente del exceso, no tiene suerte.
Muchas API de C que utilizan devoluciones de llamadas pasan un parámetro void*
especificado por el usuario a la devolución de llamada, que puede usar para almacenar un puntero a su clase. A continuación, puede pasar una función gratuita que arroja los datos del usuario a un puntero de clase y luego llama a la función miembro. Sin embargo, la forma en que se diseña el exceso no lo permite.
Puede usar el enlace de Boost para funciones de miembros, por ejemplo, crear un hilo en una función miembro:
class classA
{
public:
void memberThreadFunc(int i);
};
void main()
{
classA a;
boost::thread( boost::bind(&classA::memberFunc, &a, 123) );
}
Mi manera de resolver esto es simple:
Primero haz un puntero antes de la función principal.
Al comienzo de la función principal, configure el puntero como instancia de su clase.
Luego, en la nueva función definida para la representación, puede acceder a su objeto con un puntero global.
/**
Class argon is defined in external header file.
*/
Argon *argonPtr;
void renderScene();
int main()
{
Argon argon;
argonPtr = &argon;
glutDisplayFunc( render );
}
void render()
{
RenderStuff();
argonPtr->Render();
}
Espero que funcione para usted, para mí lo hace.