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 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 />

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

Saved successfully!

Ooh no, something went wrong!