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

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Mar Mayo 19 05:34:33 CEST 2015


Muchas gracias Steven, creo que ese ha sido el problema que hemos estado
enfrentando durante horas.

Hemos probado también con esta clase ( librería ) de delegados para C++.

https://github.com/marcmo/delegates

¿ Entonces se supone que esta librería tiene también esta misma limitación
en cuanto al ámbito de los métodos que puedes registrar ???

Ahora se entiende que todos los ejemplos fueran sobre el método main ();

Sí, en ese caso el usar functores es una solución sencilla y efectiva.

Muchas gracias como siempre por estar ahí para resolvernos las dudas.

Un abrazo.

El 19 de mayo de 2015, 5:22, Davidson, Steven <srd4121 en njit.edu> escribió:

> 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.
>>
>>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150519/e8cfe4a5/attachment.html>


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