13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!