[C con Clase] Puntero a función para sistema de eventos

Davidson, Steven srd4121 en njit.edu
Mar Mayo 19 05:22:18 CEST 2015


Hola Miguel Ángel,

En primer lugar, deberías darnos el mensaje del error que te da el
compilador, ya que es muy difícil dar una respuesta debida sin información,
especialmente al no tener más código fuente. De todas maneras, creo saber
el error por la explicación que das: "registrar métodos [...] en un array
de punteros a funciones". Esto no es posible. Un puntero a una función
miembro no es lo mismo que un puntero a una función (no miembro). O bien
usas punteros a funciones miembro o bien usas punteros a funciones, ya sean
globales o miembros pero estáticas.

Una solución es usar functores: objetos de una clase que sirve para
encapsular una función. Así puedes crear un array de objetos que comparten
la misma interfaz pública e invocar la función miembro por el mismo nombre.
Lo más seguro es que te interese polimorfismo, por lo que los objetos son
polimórficos dentro de un array. Podrías crear una clase interfaz, por
ejemplo,

class SDLEventHandler
{
public:
  virtual void invoke( const SDL_Event &event ) = 0;
};

Y ahora heredamos de esta clase abstracta:

class window : public ISDLEventHandler
{
public:
  virtual void invoke( const SDL_Event &event );
  ...
};

class panel : public ISDLEventHandler
{
public:
  virtual void invoke( const SDL_Event &event );
  ...
};

class commandLineManager : public ISDLEventHandler
{
public:
  virtual void invoke( const SDL_Event &event );
  ...
};

Luego creamos el array de "functores":

std::vector<ISDLEventHandler &> lista_delegados;
...
window principal;
panel p1, p2;
commandLineManager clm;
...
lista_delegados.push_back( principal );
lista_delegados.push_back( p1 );
lista_delegados.push_back( p2 );
lista_delegados.push_back( clm );

Y cuando se necesite, invocamos la función miembro correcta para gestionar
el evento:

for( int i=0; i<lista_delegados.size(); i++ )
  lista_delegados[i].invoke( e );


Espero que esto te sirva.

Steven


2015-05-18 22:25 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
miguelangeltorresfp en gmail.com>:

> Hola a todos.
>
> Estoy tratando de registrar métodos de distintas clases en un array de
> punteros a funciones en una clase manager.
>
> Defino el tipo de puntero a función y creo un array de punteros a
> funciones de este tipo :
>
> typedef void(*Function_Pointer) (const SDL_Event& event);
> typedef std::vector <Function_Pointer> Functions_Array;
>
> Functions_Array devices_calls;
>
> Y luego en otra clase me gustaría poder registrar punteros a funciones en
> este array.
>
> void update(const SDL_Event & event);
>
> Pero cuando voy a hacer el push_back en el array me da un error que no
> acierto a entender.
>
>  devices_calls.push_back(update);
>
> El array de punteros a funciones lo declaro en una clase "InputManager" e
> intento registrar el puntero a función desde otra clase, "KeyboardManager".
>
>
> Gracias y saludos a todos.
>
> PD - es que los ejemplos que veo por ahí hacen esto pero desde el main y
> con funciones que no reciben parámetros.
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150518/5425ea19/attachment.html>


Más información sobre la lista de distribución Cconclase