[C con Clase] Sistema de eventos en C++. Callbacks

Miguel Ángel Torres Fernández-Píñar miguelangeltorresfp en gmail.com
Vie Dic 27 21:52:56 CET 2013


jo.........tercera disculpa en un segundo.

Funciona perfectamente !!!!.

Era un error mío.


El 27 de diciembre de 2013, 21:47, Miguel Ángel Torres Fernández-Píñar <
miguelangeltorresfp en gmail.com> escribió:

> Disculpar otra vez que se envió sin darme cuenta.
>
> El problema que tengo es que en la clase Estado cuando hago :
>
> gestor->cambiar_estado( "otro_estado" );
>
> Me dice que no se permite un puntero a un tipo de clase incompleta.
>
> Y si comento esa sentencia todo compila perfectamente.
>
> Gracias de antemano.
>
> PD - sería mejor pasar una referencia a la clase Gestor en vez de un
> puntero ???
>
>
>
> El 27 de diciembre de 2013, 21:44, Miguel Ángel Torres Fernández-Píñar <
> miguelangeltorresfp en gmail.com> escribió:
>
> uf, disculpar que moleste de nuevo, es que no sé cómo hacer esto.
>>
>> Paso una referencia del Gestor a una clase Estado dentro de la misma
>> clase Gestor de esta forma : ( estoy usando una librería que tiene
>> implementado Shared_Ptr ).
>>
>> Shared_Ptr< Estado > estado;
>> estado.reset( new Estado( this ) );
>>
>> En la clase Estado tengo :
>>
>> class Estado
>> {
>>        Gestor * gestor;
>>
>>          Estado ( Gestor * _gestor )
>>          {
>>                  gestor = _gestor;
>>          }
>>
>> }
>>
>>
>>
>> El 27 de diciembre de 2013, 18:22, Miguel Ángel Torres Fernández-Píñar <
>> miguelangeltorresfp en gmail.com> escribió:
>>
>> uf, Steven, muchísimas gracias por estos ejemplos y aclaraciones.
>>>
>>> El primer ejemplo me viene como anillo al dedo.
>>>
>>> El segundo no lo entiendo del todo. Realmente sé más o menos lo que es
>>> el polimorfismo, pero aun no he conseguido llegar al paso en el que integre
>>> eso en mis programas. Poco a poco.
>>>
>>> Pero es GENIAL !!!! tener a profesores que te puedan ir resolviendo
>>> dudas conforme te vas encontrando con los problemas.
>>>
>>> Algún día espero poder entrar en un sitio a trabajar y tener alguien
>>> como tú de referencia.
>>>
>>> Un super saludo a tí y a todos los demás de la lista !!!.
>>>
>>>
>>> El 27 de diciembre de 2013, 17:52, Davidson, Steven <srd4121 en njit.edu>escribió:
>>>
>>>> Hola Miguel Ángel,
>>>>
>>>> 2013/12/27 Miguel Ángel Torres Fernández-Píñar <
>>>> miguelangeltorresfp en gmail.com>
>>>>
>>>>> Hola a todos,
>>>>>
>>>>
>>>> [CORTE]
>>>>
>>>> He pensado en que por ejemplo podría tener un método en
>>>>> "Gestor_Principal" que fuera "change_state". Le podría pasar una referencia
>>>>> de este método a cada clase en el momento de crearla.
>>>>>
>>>>>
>>>> No aconsejo usar punteros a funciones miembro (métodos), porque creas
>>>> una relación demasiada estrecha entre las clases. Si optas por usar
>>>> polimorfismo, no podrías hacerlo por el puntero a la función miembro de una
>>>> clase específica, cuando te interesaría elegir otras funciones miembro de
>>>> otras clases en la jerarquía.
>>>>
>>>> Lo que sí puedes hacer es "registrar" el objeto del gestor dentro de
>>>> cada objeto del estado. De esta manera, puedes invocar 'change_state()' del
>>>> gestor; por ejemplo,
>>>>
>>>> class GestorEstados
>>>> {
>>>>   ...
>>>>   void CambiarEstado( Estado *pNuevo );
>>>> };
>>>>
>>>> class Estado
>>>> {
>>>> protected:
>>>>   GestorEstados *pge;
>>>>
>>>> public:
>>>>   Estado( GestorEstados *ptr ) : pge(ptr)  {}
>>>>
>>>>   void CambiarEstado( Estado *pNuevo )
>>>>   {
>>>>     pge->CambiarEstado( pNuevo );
>>>>   }
>>>>   ...
>>>> };
>>>>
>>>> Aquí tenemos 'CambiarEstado()' en ambas clases, para facilitar su uso.
>>>> Sin embargo, quizá no sea necesario tener un puntero al gestor como miembro
>>>> de cada estado y basta con pasar el objeto polimórfico de 'GestorEstados' a
>>>> cada función miembro de la clase 'Estado'. Por ejemplo,
>>>>
>>>> class GestorEstados
>>>> {
>>>>   void CambiarEstado( Estado *pNuevo );
>>>>   ...
>>>> };
>>>>
>>>> class Estado
>>>> {
>>>>   ...
>>>>   void CambiarEstado( GestorEstados *pge, Estado *pNuevo )
>>>>   {
>>>>     pge->CambiarEstado( pNuevo );
>>>>   }
>>>> };
>>>>
>>>> Aquí, pasamos el gestor en el momento que se necesite, en lugar de que
>>>> cada objeto de 'Estado' mantenga un puntero al gestor.
>>>>
>>>>
>>>> Espero que esto te ayude.
>>>>
>>>> Steven
>>>>
>>>>
>>>> _______________________________________________
>>>> 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/20131227/fff73dd0/attachment.html>


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