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 150 — #188<br />
✐<br />
Capítulo 4. Abstracción de Datos<br />
de ambas librerías <strong>en</strong> la misma unidad de traducción Afortunadam<strong>en</strong>te, el compilador<br />
C dará un m<strong>en</strong>saje de error diciéndonos que hay una incoher<strong>en</strong>cia de tipos <strong>en</strong><br />
las listas de argum<strong>en</strong>tos de ambas declaraciones. No obstante, aunque no incluyamos<br />
los archivos de cabecera <strong>en</strong> la unidad de traducción igual t<strong>en</strong>dremos problemas<br />
con el <strong>en</strong>lazador. Un bu<strong>en</strong> <strong>en</strong>lazador detectará y avisará cuando se produzca uno<br />
de estos conflictos de nombres. Sin embargo, hay otros que simplem<strong>en</strong>te tomarán<br />
el primer nombre de la función que <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong>, buscando <strong>en</strong> los archivos objeto <strong>en</strong><br />
el ord<strong>en</strong> <strong>en</strong> el que fueron pasados <strong>en</strong> la lista de <strong>en</strong>lazado. (Este comportami<strong>en</strong>to se<br />
puede considerar como una v<strong>en</strong>taja ya que permite reemplazar las funciones de las<br />
librerías aj<strong>en</strong>as con funciones propias.)<br />
En cualquiera de los dos casos, llegamos a la conclusión de que <strong>en</strong> C es imposible<br />
usar dos bibliotecas <strong>en</strong> las cuales existan funciones con nombres idénticos. Para<br />
solucionar este problema, los proveedores de librerías <strong>en</strong> C pon<strong>en</strong> un prefijo único a<br />
todas las funciones de la librería. En nuestro ejemplo, las funciones initialize()<br />
y cleanup() habría que r<strong>en</strong>ombrarlas como CStash_initialize() y CStash_cleanup().<br />
Esta es una técnica lógica: decoramos los nombres de las funciones<br />
con el nombre de la estructura sobre la cual trabajan.<br />
Este es el mom<strong>en</strong>to de dirigir nuestros pasos a las primeras nociones de construcción<br />
de clases <strong>en</strong> <strong>C++</strong>. Como el lector ha de saber, las variables declaradas d<strong>en</strong>tro de<br />
una estructura no ti<strong>en</strong><strong>en</strong> conflictos de nombres con las variables globales. ¿Por qué,<br />
<strong>en</strong>tonces, no aprovechar esta característica de las variables para evitar los conflictos<br />
de nombres de funciones declarándolas d<strong>en</strong>tro de la estructura sobre la cual operan<br />
O sea, ¿por qué no hacer que las funciones sean también miembros de las estructuras<br />
4.3. El objeto básico<br />
Nuestro primer paso será exactam<strong>en</strong>te ese. Meter las funciones <strong>C++</strong> d<strong>en</strong>tro de<br />
las estructuras como «funciones miembro». Éste es el aspecto que ti<strong>en</strong>e la estructura<br />
una vez realizados estos cambios de la versión C de la CStash a la versión <strong>en</strong> <strong>C++</strong>, a<br />
la que llamaremos Stash:<br />
//: C04:CppLib.h<br />
// C-like library converted to <strong>C++</strong><br />
struct Stash {<br />
int size; // Size of each space<br />
int quantity; // Number of storage spaces<br />
int next; // Next empty space<br />
// Dynamically allocated array of bytes:<br />
unsigned char* storage;<br />
// Functions!<br />
void initialize(int size);<br />
void cleanup();<br />
int add(const void* elem<strong>en</strong>t);<br />
void* fetch(int index);<br />
int count();<br />
void inflate(int increase);<br />
}; ///:~<br />
La primera difer<strong>en</strong>cia que puede notarse es que no se usa typedef. A difer<strong>en</strong>cia<br />
de C que requiere el uso de typedef para crear nuevos tipos de datos, el compila-<br />
150<br />
✐<br />
✐<br />
✐<br />
✐