/*

El problema del Orden de Inicialización de las Variables Estáticas

Recientemente, en el desarrollo de una aplicación me topé con el problema del orden de inicialización de
las variables estáticas. ¿De qué se trata?

Supongamos que tenemos las siguientes clases (en sus respectivos archivos) con sus variables estáticas
respectivas que representan al número pi.

*/

// Archivo floatBCD.h

class floatBCD	{
double val;
public:
	static floatBCD pi;
	// Constructor de un objeto floatBCD a partir de un objeto double
	floatBCD(const double &d):
	val(d)
		{
		}

};

// Archivo floatBCD.cpp

#include "floatBCD.h"

floatBCD floatBCD::pi=3.1416; // Inicialización de la variable estática pi, que pertenece a la clase floatBCD

// Archivo complexBCD.h

#include "floatBCD.h"

class complexBCD	{
floatBCD re,im;
public:
	static complexBCD pi;

	// Constructor de un objeto complexBCD a partir de un objeto floatBCD
	complexBCD(const floatBCD &f):
	re(f), im()
		{
		}
};

// Archivo complexBCD.cpp

#include "complexBCD.h"
#include "floatBCD.h"

complexBCD complexBCD::pi(floatBCD::pi); // Inicialización de la variable estática pi, que pertenece
// a la clase complexBCD, esta variable depende de la variable estática floatBCD::pi

/*

Hasta aquí todo bien, ¿Cuál es el problema entonces?

El problema reside en que una variable estática (complexBCD::pi) depende de otra (floatBCD::pi) en su inicialización y,
no hay manera (en realidad algunos compiladores brindan esa facilidad, pero no es un estándar) de decirle al compilador
que primero se inicialice la variable independiente, y después la dependiente. Por lo que si contamos con un poco de
suerte, las variables se inicializarán en el orden adecuado, ¿Y que pasará si no es así? ¡Cataplum! En la variable
dependiente tendremos un valor indeterminado (usualmente es 0) que causará problemas a nuestro programa.

¿Cómo resolver el problema?

Usaremos el concepto "Construcción en el primer uso", es decir, la variable se construirá la primera vez
que se intente usar.

En lugar de usar la variable estáticas de clase, usaremos una variable estática de función:

*/

// Archivo floatBCD.h

class floatBCD	{
double val;
public:
	// Constructor de un objeto floatBCD a partir de un objeto double
	floatBCD(const double &d):
	val(d)
		{
		}

	// Función para obtener la variable pi inicializada
	// El estándar dice que las variables estáticas de función se inicializan al pasar
	// por la línea en la que están declaradas.
	static const floatBCD &getpi()
		{
		static floatBCD pi=3.1416;

		return pi;
		}

};



// Archivo complexBCD.h

#include "floatBCD.h"

class complexBCD	{
floatBCD re,im;
public:
	static complexBCD pi;

	// Constructor de un objeto complexBCD a partir de un objeto floatBCD
	complexBCD(const floatBCD &f):
	re(f), im()
		{
		}
};

// Archivo complexBCD.cpp

#include "complexBCD.h"

complexBCD complexBCD::pi(floatBCD::getpi()); // Inicialización de la variable estática pi, que pertenece
// a la clase complexBCD, esta variable depende ahora de la variable estática de la función floatBCD::getpi()

/*

¿Qué ganamos con esto?

Es simple, la llamada a la función floatBCD::getpi(), fuerza la inicialización (o construcción) de la variable estática pi
de dicha función antes de la inicialización de la variable estática complexBCD::pi; esto es, la variable independiente se
construye en el primer uso y tendremos un valor confiable en la variable dependiente, con lo que el problema ha quedado
resuelto.


Ariel Medina

*/