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 184 — #222<br />
✐<br />
Capítulo 5. Ocultar la implem<strong>en</strong>tación<br />
//: C05:Handle.cpp {O}<br />
// Handle implem<strong>en</strong>tation<br />
#include "Handle.h"<br />
#include "../require.h"<br />
// Define Handle’s implem<strong>en</strong>tation:<br />
struct Handle::Cheshire {<br />
int i;<br />
};<br />
void Handle::initialize() {<br />
smile = new Cheshire;<br />
smile->i = 0;<br />
}<br />
void Handle::cleanup() {<br />
delete smile;<br />
}<br />
int Handle::read() {<br />
return smile->i;<br />
}<br />
void Handle::change(int x) {<br />
smile->i = x;<br />
} ///:~<br />
Chesire es una estructura anidada, así que se debe ser definido con resolución de<br />
ámbito:<br />
struct Handle::Cheshire {<br />
En Handle::initialize(), se solicita espacio de almac<strong>en</strong>ami<strong>en</strong>to para una<br />
estructura Chesire, y <strong>en</strong> Handle::cleanup() se libera ese espacio. Este espacio<br />
se usa para almac<strong>en</strong>ar todos los datos que estarían normalm<strong>en</strong>te <strong>en</strong> la sección privada<br />
de la clase. Cuando compile Handle.cpp, esta definición de la estructura estará<br />
escondida <strong>en</strong> el fichero objeto donde nadie puede verla. Si cambia los elem<strong>en</strong>tos de<br />
Chesire, el único archivo que debe ser recompilado es Handle.cpp pues el archivo<br />
de cabecera permanece inalterado.<br />
El uso de Handle es como el uso de cualquier clase: incluir la cabecera, crear<br />
objetos, y mandar m<strong>en</strong>sajes.<br />
//: C05:UseHandle.cpp<br />
//{L} Handle<br />
// Use the Handle class<br />
#include "Handle.h"<br />
int main() {<br />
Handle u;<br />
u.initialize();<br />
u.read();<br />
u.change(1);<br />
u.cleanup();<br />
} ///:~<br />
184<br />
✐<br />
✐<br />
✐<br />
✐