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 300 — #338<br />
✐<br />
Capítulo 10. Control de nombres<br />
}<br />
// Simulate the dep<strong>en</strong>d<strong>en</strong>cy problem:<br />
extern Dep<strong>en</strong>d<strong>en</strong>cy1 dep1;<br />
Dep<strong>en</strong>d<strong>en</strong>cy2 dep2(dep1);<br />
Dep<strong>en</strong>d<strong>en</strong>cy1 dep1;<br />
int x1 = separator();<br />
// But if it happ<strong>en</strong>s in this order it works OK:<br />
Dep<strong>en</strong>d<strong>en</strong>cy1 dep1b;<br />
Dep<strong>en</strong>d<strong>en</strong>cy2 dep2b(dep1b);<br />
int x2 = separator();<br />
// Wrapping static objects in functions succeeds<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 />
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 />
int main() {<br />
Dep<strong>en</strong>d<strong>en</strong>cy2& dep2 = d2();<br />
} ///:~<br />
Las funciones d1() y d2() conti<strong>en</strong><strong>en</strong> instancias estáticas de los objetos Dep<strong>en</strong>d<strong>en</strong>cy1<br />
y Dep<strong>en</strong>d<strong>en</strong>cy2. Ahora, la única forma de acceder a los objetos estáticos es<br />
llamando a las funciones y eso fuerza la inicialización estática <strong>en</strong> la primera llamada<br />
a la función. Esto significa que se garantiza la inicialización correcta, cosa que verá<br />
cuando lance el programa y observe la salida.<br />
He aquí como debe organizar el código para usar esta técnica. Ordinariam<strong>en</strong>te,<br />
los objetos estáticos deb<strong>en</strong> ser definidos <strong>en</strong> archivos difer<strong>en</strong>tes (puesto que se ha visto<br />
forzado a ello por alguna razón; recuerde que definir objetos estáticos <strong>en</strong> archivos<br />
difer<strong>en</strong>tes es lo que causa el problema), por lo que definirá las funciones <strong>en</strong>voltorio<br />
wrapping functions) <strong>en</strong> archivos difer<strong>en</strong>tes. Pero éstas necesitan estar declaradas<br />
<strong>en</strong> los archivos de cabecera:<br />
//: C10:Dep<strong>en</strong>d<strong>en</strong>cy1StatFun.h<br />
#ifndef DEPENDENCY1STATFUN_H<br />
#define DEPENDENCY1STATFUN_H<br />
#include "Dep<strong>en</strong>d<strong>en</strong>cy1.h"<br />
extern Dep<strong>en</strong>d<strong>en</strong>cy1& d1();<br />
#<strong>en</strong>dif // DEPENDENCY1STATFUN_H ///:~<br />
En realidad, el «extern» es redundante para la declaración de la función. Éste es<br />
el segundo archivo de cabecera:<br />
//: C10:Dep<strong>en</strong>d<strong>en</strong>cy2StatFun.h<br />
#ifndef DEPENDENCY2STATFUN_H<br />
#define DEPENDENCY2STATFUN_H<br />
300<br />
✐<br />
✐<br />
✐<br />
✐