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

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


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/187f9d51/attachment.html>


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