<div dir="ltr">Hola Miguel Ángel,<div class="gmail_extra"><br><div class="gmail_quote">2013/12/27 Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div><div>Hola a todos, <br></div></div>
</div></div></blockquote><div><br></div><div>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><div><div><div>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.<br>
</div></div><div><br></div></div></div></blockquote><div><br></div><div>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.</div>
<div><br></div><div>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,</div><div><br></div>
<div>class GestorEstados<br>{<br></div><div>  ...</div><div><div>  void CambiarEstado( Estado *pNuevo );</div>};</div><div><br></div><div>class Estado<br>{<br></div><div>protected:</div><div>  GestorEstados *pge;</div><div>
<br></div><div>public:<br>  Estado( GestorEstados *ptr ) : pge(ptr)  {}</div><div><br></div><div>  void CambiarEstado( Estado *pNuevo )</div><div>  {</div><div>    pge->CambiarEstado( pNuevo );</div><div>  }</div><div>
  ...<br></div><div>};</div><div><br></div><div><div>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,</div>
</div><div><br></div><div>class GestorEstados<br>{<br><div>  void CambiarEstado( Estado *pNuevo );</div><div>  ...</div>};</div><div><br></div><div>class Estado<br>{<br>  ...</div><div>  void CambiarEstado( GestorEstados *pge, Estado *pNuevo )</div>
<div>  {</div><div>    pge->CambiarEstado( pNuevo );</div><div>  }</div><div>};</div><div><br></div><div>Aquí, pasamos el gestor en el momento que se necesite, en lugar de que cada objeto de 'Estado' mantenga un puntero al gestor.</div>
<div><br></div><div><br></div><div>Espero que esto te ayude.</div><div><br></div><div>Steven</div><div><br></div></div></div></div>