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

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

Saved successfully!

Ooh no, something went wrong!