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

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


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


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