sanyaade-g2g-repos / quimeraengine

Automatically exported from code.google.com/p/quimeraengine
0 stars 1 forks source link

Corregir problema de orden de inicialización de miembros estáticos #208

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Estamos teniendo un problema de inicialización de miembros estáticos, aquel 
famoso error que hacía que, aún inicializando los miembros estáticos, 
contuvieran valores de fábrica.
Esto se debe a un problema en el orden en que se inicializan, y nos ocurre por 
utilizar miembros estáticos para inicializar otros miembros estáticos. Lo que 
pasa es que el orden en que los miembros estáticos (que al final son variables 
globales metidas en un espacio de nombres) se crean es "aleatorio", cada 
compilador lo hará de una manera en distintas situaciones. Ejemplo:

Si usamos QVector3::VectorOfOnes para initializar QHexahedron::UnitCube, no hay 
manera de asegurar que VectorOfOnes habrá sido ya inicializado, por lo que 
UnitCube tendrá un valor no deseado.

Este es un problema de los típicos de C++ y al que no me he sabido anticipar. 
Por tanto, ahora habrá que corregirlo y tenerlo en mente para el futuro.

La forma de hacerlo será la siguiente:

[Dentro de la clase]
inline static QVector3& GetVectorOfOnes();

[Fuera de la clase]
QVector3& QVector3::GetVectorOfOnes()
{
    static QVector3 sVectorOfOnes(QFloat::_1, QFloat::_1, QFloat::_1);
    return sVectorOfOnes;
}

La duda que me surge ahora es: ¿Y cómo aseguramos que los miembros de QFloat 
están inicializados? De momento confiaremos en que los floats van a ser usados 
mucho antes que las clases de Math.

Más información: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

Original issue reported on code.google.com by Lince3D@gmail.com on 29 Oct 2011 at 12:40

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 6 Nov 2011 at 10:15

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 13 Nov 2011 at 10:48

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 9 Dec 2011 at 12:44

GoogleCodeExporter commented 8 years ago

Original comment by jwl...@gmail.com on 9 Dec 2011 at 9:36