[C con Clase] Instanciar una Clase y accederla desde varias

Steven Davidson steven en conclase.net
Jue Mayo 3 13:55:20 CEST 2007


Hola Pepe,

El pasado 2007-04-26 22:41:51, Pepe escribió:

P> Hola, tengo una pregunta basica.
P> Tengo una clase core que inicializa mi aplicacion y crea instancias de otras
P> clases.
P> Una de esas clases es la que hace el logueo sobre un archivo de como va
P> la aplicacion, lo ejemplifico:
P> class core {
P> public:
P>     ...
P> };
P> class logueo {
P> public:
P>    ...
P>    void print(string msg);
P> };
P> class  Persona {
P>  ...
P> };
P> class etc {
P>  ..
P> };
P> Lo que necesito es que TODAS las instancias de las clases (Persona, etc,
P> core)
P> puedan utilizar el metodo print de logueo el cual escribe en un archivo los
P> "estados"
P> de mi aplicacion.
P> Cual es la manera mas optima de hacerlo?

Tal y como nos presentas el problema, éste implicaría que cualesquier objetos de las clases 'Persona', 'etc', y 'core' tienen un objeto de la clase 'logueo', o quizás un puntero o referencia a tal objeto. Por ejemplo,

class Persona
{
  logueo *pLogueo;
  ...
  void func()
  {
    string sMensaje;
    ...
    pLogueo->print( sMensaje );
  }
};

Si no existe este diseño; es decir, no tenemos acceso al objeto de la clase 'logueo', entonces tenemos que analizar lo que queremos hacer. Si 'print()' no usa ninguna propiedad (dato miembro) de la clase 'logueo', entonces posiblemente podamos definir la función miembro 'print()' como estática. Esto es,

class logueo
{
  ...
  static void print( string msg );
};

Con esto, podemos invocar 'print()' directamente sin tener un objeto a tal clase. Por ejemplo,


class Persona
{
  ...
  void func()
  {
    string sMensaje;
    ...
    logueo::print( sMensaje );
  }
};

Sospecho que esto no es el caso, pero lo presento por si acaso.

Existe otro tipo de relación y sistema para usar 'logueo'. Es posible que sea más bien una clase interfaz. Si te interesa esta relación, entonces las otras clases deberían heredar de 'logueo'. Típicamente, las clases interfaces son abstractas, aunque algunas pueden ser concretas pero virtuales. Por ejemplo,

class logueo
{
  ...
  virtual void print( string sMensaje );
};

class Persona : public logueo
{
  // Versión de 'print()' para 'Persona'
  /*
  void print( string sMensaje )
  {
    ...
  }
  */
};


Sin conocer más detalles acerca de 'logueo' y de su relación con las clases restantes, no puedo ser más preciso.


Espero que esto te sirva.

Steven


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