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