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 ( CNacional,
CLocal; CInternacional; CAereo 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).
[1] En estos casos no basta una definición adelantada del tipo class Sobre;. Es necesaria una definición completa.