Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 301 — #339<br />
✐<br />
10.4. Dep<strong>en</strong>d<strong>en</strong>cia <strong>en</strong> la inicialización de variables estáticas<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy2.h"<br />
extern Dep<strong>en</strong>d<strong>en</strong>cy2& d2();<br />
#<strong>en</strong>dif // DEPENDENCY2STATFUN_H ///:~<br />
Ahora, <strong>en</strong> los archivos de implem<strong>en</strong>tación donde previam<strong>en</strong>te habría situado las<br />
definiciones de los objetos estáticos, situará las definiciones de las funciones <strong>en</strong>voltorio:<br />
//: C10:Dep<strong>en</strong>d<strong>en</strong>cy1StatFun.cpp {O}<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy1StatFun.h"<br />
Dep<strong>en</strong>d<strong>en</strong>cy1& d1() {<br />
static Dep<strong>en</strong>d<strong>en</strong>cy1 dep1;<br />
return dep1;<br />
} ///:~<br />
Presumiblem<strong>en</strong>te, otro código puede también componer esos archivos. He aquí<br />
otro archivo:<br />
//: C10:Dep<strong>en</strong>d<strong>en</strong>cy2StatFun.cpp {O}<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy1StatFun.h"<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy2StatFun.h"<br />
Dep<strong>en</strong>d<strong>en</strong>cy2& d2() {<br />
static Dep<strong>en</strong>d<strong>en</strong>cy2 dep2(d1());<br />
return dep2;<br />
} ///:~<br />
Ahora hay dos archivos que pued<strong>en</strong> ser <strong>en</strong>lazados <strong>en</strong> cualquier ord<strong>en</strong> y si contuvies<strong>en</strong><br />
objetos estáticos ordinarios podría producirse cualquier ord<strong>en</strong> de inicialización.<br />
Pero como conti<strong>en</strong><strong>en</strong> funciones <strong>en</strong>voltorio, no hay posibilidad de inicialización<br />
incorrecta:<br />
//: C10:Technique2b.cpp<br />
//{L} Dep<strong>en</strong>d<strong>en</strong>cy1StatFun Dep<strong>en</strong>d<strong>en</strong>cy2StatFun<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy2StatFun.h"<br />
int main() { d2(); } ///:~<br />
Cuando ejecute este programa verá que la inicialización del objeto estático D-<br />
ep<strong>en</strong>d<strong>en</strong>cy1 siempre se lleva a cabo antes de la inicialización del objeto estático<br />
Dep<strong>en</strong>d<strong>en</strong>cy2. También puede ver que ésta es una solución bastante más simple<br />
que la de la uno.<br />
Puede verse t<strong>en</strong>tado a escribir d1() y d2() como funciones inline d<strong>en</strong>tro de<br />
sus respectivos archivos de cabecera, pero eso es algo que, definitivam<strong>en</strong>te, no debe<br />
hacer. Una función inline puede ser duplicada <strong>en</strong> cada archivo <strong>en</strong> el que aparezca<br />
y esa duplicación incluye la definición de los objetos estáticos. Puesto que las funciones<br />
inline llevan asociado por defecto <strong>en</strong>lazado interno, esto provocará la aparición<br />
de múltiples objetos estáticos <strong>en</strong>tre las diversas unidades de traducción, lo que<br />
ciertam<strong>en</strong>te causará problemas. Es por eso que debe asegurarse que sólo existe una<br />
única definición para cada función cont<strong>en</strong>edora, y eso significa no hacerlas inline.<br />
301<br />
✐<br />
✐<br />
✐<br />
✐