Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


Ejemplo de definición de clases

El presente ejemplo es una muestra de como en ciertos casos, es necesario posponer la definición de un método hasta que no se han realizado otras definiciones previas. Lo que obliga a una definición externa (offline). En este caso, el método cuya definición hay que realizar una vez que se han definido otras clases previamente, es uno de los constructores de la clase.

class Sobre {
  public:
  Sobre() { sPtr = NULL; } // constructor por defecto
  Sobre(int);              // constructor, definición pospuesta
  virtual ~Sobre();        // destructor
  private:
  Sobre* sPtr;
};

class CNacional : public Sobre { /* ... */ };
class CLocal : public Sobre { /* ... */ };
class CInternacional : public Sobre { /* ... */ };
class CAereo : public Sobre { /* ... */ };
class CMensajero : public Sobre { /* ... */ };
 
Sobre::Sobre(int n) {      // definición pospuesta
  if (n == 1)  sPtr = new CNacional;
  else if (n == 2) sPtr = new CLocal;
  else if (n == 3) sPtr = new CInternacional;
  else if (n == 3) sPtr = new CAereo;
  else if (n == 4) sPtr = new CMensajero;
}


En este caso, la clase Sobre tiene dos constructores: uno por defecto, que se define en "Inline". El otro acepta un entero, y su definición debe ser "offline", después que se han definido ciertas clases derivadas. La razón es que en la definición de este segundo constructor existen referencias a las clases derivadas ( CNacionalCLocalCInternacionalCAereo y CMensajero).

La definición de estas clases no puede realizarse antes que la de Sobre, dado que derivan de ella. De no hacerse así, se recibiría un error del compilador:  'Sobre' must be a previously defined class or struct [1].

Por otra parte, si pretendemos efectuar la definición del constructor Sobre::Sobre(int) antes que la definición de las clases derivadas, se obtendría igualmente un error de compilación, ya que las sentencias sPtr = new ... se refieren a tipos que no está aún definidos.

Nota: este tipo de construcción aparece frecuentemente en ciertas técnicas de programación avanzada. Por ejemplo en la denominada Carta-Sobre ("Letter-envelope"), que comentamos en el capítulo dedicado a las técnicas de programación avanzada ( 4.13.4).

  Inicio.


[1]  En estos casos no basta una definición adelantada del tipo class Sobre;. Es necesaria una definición completa.