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

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

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

Saved successfully!

Ooh no, something went wrong!