Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 296 — #334<br />
✐<br />
Capítulo 10. Control de nombres<br />
plataforma determinada y, de golpe y misteriosam<strong>en</strong>te, compilarlo <strong>en</strong> otro <strong>en</strong>torno<br />
y que deje de funcionar.<br />
10.4.1. Qué hacer<br />
Exist<strong>en</strong> tres aproximaciones para tratar con este problema:<br />
1. No hacerlo. Evitar las dep<strong>en</strong>d<strong>en</strong>cias de inicialización estática es la mejor solución.<br />
2. Si debe hacerlo, coloque las definiciones de objetos estáticos críticos <strong>en</strong> un único<br />
fichero, de forma que pueda controlar, de forma portable, su inicialización<br />
colocándolos <strong>en</strong> el ord<strong>en</strong> correcto.<br />
3. Si está conv<strong>en</strong>cido que es inevitable dispersar objetos estáticos <strong>en</strong>tre unidades<br />
de traducción difer<strong>en</strong>tes (como <strong>en</strong> el caso de una librería, donde no puede<br />
controlar el programa que la usa), hay dos técnicas de programación para solv<strong>en</strong>tar<br />
el problema.<br />
Técnica uno<br />
El pionero de esta técnica fue Jerry Schwarz mi<strong>en</strong>tras creaba la librería iostream<br />
(puesto que las definiciones para cin, cout y cerr son static y resid<strong>en</strong> <strong>en</strong> archivos<br />
difer<strong>en</strong>tes). Realm<strong>en</strong>te es inferior a la segunda técnica pero ha pululado durante<br />
mucho tiempo por lo que puede <strong>en</strong>contrarse con código que la utilice; así pues, es<br />
importante que <strong>en</strong>ti<strong>en</strong>da como funciona.<br />
Esta técnica requiere una clase adicional <strong>en</strong> su archivo de cabecera. Esta clase es<br />
la responsable de la inicialización dinámica de sus objetos estáticos de librería. He<br />
aquí un ejemplo simple:<br />
//: C10:Initializer.h<br />
// Static initialization technique<br />
#ifndef INITIALIZER_H<br />
#define INITIALIZER_H<br />
#include <br />
extern int x; // Declarations, not definitions<br />
extern int y;<br />
class Initializer {<br />
static int initCount;<br />
public:<br />
Initializer() {<br />
std::cout