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

Davidson, Steven srd4121 en njit.edu
Vie Dic 27 17:52:47 CET 2013


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20131227/d7acc4bc/attachment.html>


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