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 142 — #180<br />

✐<br />

Capítulo 4. Abstracción de Datos<br />

4.1. Una librería pequeña al estilo C<br />

Aunque muchas veces, una librería comi<strong>en</strong>za como una colección de funciones,<br />

si ha usado alguna librería C de terceros habrá observado que la cosa no termina ahí<br />

porque hay más que comportami<strong>en</strong>to, acciones y funciones. También hay características<br />

(azul, libras, textura, luminisc<strong>en</strong>cia), las cuales están repres<strong>en</strong>tadas por datos.<br />

En C, cuando debemos repres<strong>en</strong>tar características, es muy conv<strong>en</strong>i<strong>en</strong>te agruparlas<br />

todas juntas <strong>en</strong> una estructura, especialm<strong>en</strong>te cuando queremos repres<strong>en</strong>tar más de<br />

un tipo de cosa <strong>en</strong> el problema. Así, se puede trabajar con una variable de esta estructuras<br />

para repres<strong>en</strong>tar cada cosa.<br />

Por eso, la mayoría de las librerías <strong>en</strong> C están formadas por un conjunto de estructuras<br />

y funciones que actúan sobre las primeras. Como ejemplo de esta técnica,<br />

considere una herrami<strong>en</strong>ta de programación que se comporta como un array, pero<br />

cuyo tamaño se puede fijar <strong>en</strong> tiempo de ejecución, <strong>en</strong> el mom<strong>en</strong>to de su creación.<br />

La llamaremos CStash 1 . Aunque está escrito <strong>en</strong> <strong>C++</strong>, ti<strong>en</strong>e el estilo clásico de una<br />

librería escrita <strong>en</strong> C:<br />

//: C04:CLib.h<br />

// Header file for a C-like library<br />

// An array-like <strong>en</strong>tity created at runtime<br />

typedef struct CStashTag {<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 />

} CStash;<br />

void initialize(CStash* s, int size);<br />

void cleanup(CStash* s);<br />

int add(CStash* s, const void* elem<strong>en</strong>t);<br />

void* fetch(CStash* s, int index);<br />

int count(CStash* s);<br />

void inflate(CStash* s, int increase);<br />

///:~<br />

Normalm<strong>en</strong>te se utiliza un «rótulo» como CStashTag <strong>en</strong> aquellas estructuras que<br />

necesitan refer<strong>en</strong>ciarse d<strong>en</strong>tro de si mismas. Ese es el caso de una lista <strong>en</strong>lazada (cada<br />

elem<strong>en</strong>to de la lista conti<strong>en</strong>e un puntero al sigui<strong>en</strong>te elem<strong>en</strong>to) se necesita un puntero<br />

a la sigui<strong>en</strong>te variable estructura, o sea, una manera de id<strong>en</strong>tificar el tipo de ese<br />

puntero d<strong>en</strong>tro del cuerpo de la propia estructura. En la declaración de las estructuras<br />

de una librería escrita <strong>en</strong> C también es muy común ver el uso de typedef como<br />

el del ejemplo anterior. Esto permite al programador tratar las estructuras como un<br />

nuevo tipo de dato y así definir nuevas variables (de esa estructura) del sigui<strong>en</strong>te<br />

modo:<br />

CStash A, B, C;<br />

El puntero storage es un unsigned char*. Un unsigned char es la m<strong>en</strong>or pieza<br />

1 N de T:«Stash» se podría traducir como «Acumulador».<br />

142<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!