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 183 — #221<br />

✐<br />

5.6. Manejo de clases<br />

5.6.2. Reducir la recompilación<br />

Su <strong>en</strong>torno de programación provocará una recompilación de un fichero si este<br />

se modifica, o si se modifica otro fichero del que dep<strong>en</strong>de, es decir, un archivo de<br />

cabecera que se haya incluido. Esto significa que cada vez que se haga un cambio <strong>en</strong><br />

una clase, ya sea a la interfaz pública o a las declaraciones de los miembros privados,<br />

se provocará una recompilación de todo lo que incluya ese archivo de cabecera. Este<br />

efecto se conoce usualm<strong>en</strong>te como el problema de la clase-base frágil. Para un proyecto<br />

grande <strong>en</strong> sus comi<strong>en</strong>zos esto puede ser un gran problema pues la implem<strong>en</strong>tación<br />

suele cambiar a m<strong>en</strong>udo; si el proyecto es muy grande, el tiempo de las compilaciones<br />

puede llegar a ser un gran problema.<br />

La técnica para resolver esto se llama a veces clases manejador o el «gato de Chesire»<br />

2 - toda la información sobre la implem<strong>en</strong>tación desaparece excepto por un<br />

puntero, la "sonrisa". El puntero apunta a una estructura cuya definición se <strong>en</strong>cu<strong>en</strong>tra<br />

<strong>en</strong> el fichero de implem<strong>en</strong>tación junto con todas las definiciones de las funciones<br />

miembro. Así, siempre que la interfaz no se cambie, el archivo de cabecera permanece<br />

inalterado. La implem<strong>en</strong>tación puede cambiar a su gusto, y sólo el fichero de<br />

implem<strong>en</strong>tación deberá ser recompilado y re<strong>en</strong>lazado con el proyecto.<br />

Aquí hay un ejemplo que demuestra como usar esta técnica. El archivo de cabecera<br />

conti<strong>en</strong>e solo la interfaz publica y un puntero de una clase especificada de forma<br />

incompleta:<br />

//: C05:Handle.h<br />

// Handle classes<br />

#ifndef HANDLE_H<br />

#define HANDLE_H<br />

class Handle {<br />

struct Cheshire; // Class declaration only<br />

Cheshire* smile;<br />

public:<br />

void initialize();<br />

void cleanup();<br />

int read();<br />

void change(int);<br />

};<br />

#<strong>en</strong>dif // HANDLE_H ///:~<br />

Esto es todo lo que el programador cli<strong>en</strong>te puede ver. La linea<br />

struct Cheshire;<br />

es una especificación de tipo incompleta o una declaración de clase (una definición de<br />

clase debe incluir el cuerpo de la clase). Le dice al compilador que Chesire es el nombre<br />

de una estructura, pero no detalles sobre ella. Esta es información sufici<strong>en</strong>te para<br />

crear un puntero a la estructura; no puede crear un objeto hasta que el cuerpo de la<br />

estructura quede definido. En esta técnica, el cuerpo de la estructura está escondido<br />

<strong>en</strong> el fichero de implem<strong>en</strong>tación:<br />

2 Este nombre se le atribuye a John Carolan, uno de los pioneros del <strong>C++</strong>, y por supuesto, Lewis<br />

Carroll. Esta técnica se puede ver también como una forma del tipo de diseño «pu<strong>en</strong>te», descrito <strong>en</strong> el<br />

segundo volum<strong>en</strong>.<br />

183<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!