Koan #4: Armageddon
¿En qué criterio me baso para decidir si un artículo encaja dentro de los trucos o debe explicarse como un koan? Para que se convierta en un koan es necesario que la técnica o situación que trata me haya dejado, cuando menos, perplejo. Da lo mismo el nivel de dificultad. Y esto fue lo que me pasó con la siguiente "característica" de C++ Builder.
Cuando los programadores de Delphi necesitan ejecutar algún código al comienzo o final de un programa, y quieren encapsular este comportamiento dentro de una unit, pueden recurrir a las cláusulas initialization y finalization de la unidad:
unit UnitXX;
interface
// ...
implementation
// ...
initialization
// ...
// Aquí puede escribir una lista de instrucciones
finalization
// ...
// No se puede utilizar finalization sin initialization
end.
En C++ no existe una construcción sintáctica similar a la unit, por lo que tampoco existe un equivalente mimético de las cláusulas anteriores. Pero el programador puede recurrir a objetos globales: la definición de C++ deja bien claro que el constructor de estos objetos se debe ejecutar al inicio del programa, y el destructor se debe activar automáticamente al terminar la aplicación. ¿Seguro?
Defina una clase como la siguiente:
class TObjetoExhibicionista
{
protected:
AnsiString fName;
public:
// Constructor inline
TObjetoExhibicionista(const AnsiString aName) :
fName(aName)
{
ShowMessage("¡Ha nacido una estrella!");
}
// Un sencillo y amargo adiós a la vida (también inline)
~TObjetoExhibicionista()
{
ShowMessage("¡Adiós, mundo cruel!\nFirmado: " + fName);
}
};
Ahora, en el mismo fichero, cree una variable global con la nueva clase:
TObjetoExhibicionista pepe("Pepe");
Se supone que Pepe debe saludar al inicio del programa, y expresar su desencanto cuando se termine el programa y sea destruido (el Día del Juicio Final).
Compile y ejecute entonces la aplicación ... y disfrute de esos breves momentos de asombro, en los que pensará que algo anda "muy mal"...
|