Tengo una clase con funciones de instancia (¿o métodos?). Desde dentro de una instancia, trato de pasar punteros a esas funciones a una biblioteca. La biblioteca espera funciones estáticas.Para pasar un puntero a una función miembro
Cuando paso mis punteros a las funciones de devolución de llamada, el compilador se queja de que mis funciones no son estáticas. Traté de ponerlos estáticos, pero si lo hago, entonces no puedo acceder a los campos de instancia desde dentro de las funciones.
¿Cómo podría solucionar esto?
Pregunta similar es: Using a C++ class member function as a C callback function donde sugieren poner el método estático. Sin embargo, no puedo hacer eso, o no veo cómo podría hacerlo.
Código
GlutController::GlutController (int argc, char **argv) {
// stuff ..
// Register callbacks
glutSpecialFunc(OnSpecialKeys); // Error, need static functions
glutReshapeFunc(OnChangeSize); // Error...
glutDisplayFunc(OnRenderScene); // Error...
// stuff ..
}
GlutController::~GlutController() {
}
void GlutController::OnChangeSize(int aNewWidth, int aNewHeight){
glViewport(0,0,aNewWidth, aNewHeight);
mViewFrustrum.SetPerspective(APP_CAMERA_FOV, // If this function is
float(aNewWidth)/float(aNewHeight), // static, this won't
APP_CAMERA_NEAR, // work
APP_CAMERA_FAR);
mProjectionMatrixStack.LoadMatrix( // Same here
mViewFrustrum.GetProjectionMatrix());
mTransformPipeline.SetMatrixStacks(mModelViewMatrixStack, // Same here
mProjectionMatrixStack);
}
void GlutController::OnRenderScene(void){
mGeometryContainer.draw(); // Won't work if static
}
void GlutController::OnSpecialKeys(int key, int x, int y){
mGeometryContainer.updateKeys(key); // Won't work if static
}
responsabilidad: Me acaba de empezar C++. Leí todo Accelerated C++ y este es mi primer proyecto para probar el idioma. Mi experiencia es en Java.
No sé mucho sobre exceso, pero parece que requiere algo invocable, que no toma ningún argumento (incluidos los implícitos). Entonces, ¿no funcionaría una 'std :: function' adecuadamente construida? – juanchopanza
Cualquiera que desarrolle una función de biblioteca opaca que no puede tomar un parámetro definido por el usuario (por ejemplo, para usar en devoluciones de llamada), debe ser despedido, promovido a marketing/ventas o recibir un incentivo financiero para trabajar para una compañía rival. –
@Shahbaz Estoy tratando de hacer una demostración simple, y leí que el exceso era muy simple de usar en comparación con SDL en términos de código repetitivo. También estoy usando el libro 'OpenGL SuperBible' para guiarme. Creo que usar static/global será inevitable, o usar un Singleton como Nick dijo en su respuesta a continuación. – AntoineG