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 154 — #192<br />
✐<br />
Capítulo 4. Abstracción de Datos<br />
y no habrá ningún tipo de queja por parte de compilador. Sin embargo, <strong>en</strong> <strong>C++</strong>,<br />
lo anterior no está permitido. ¿Por qué Porque C no es tan estricto con los tipos de<br />
datos y permite asignar un puntero sin un tipo específico a un puntero de un tipo<br />
bi<strong>en</strong> determinado. No así <strong>C++</strong>, <strong>en</strong> el cual la verificación de tipos es crítica y el compilador<br />
se det<strong>en</strong>drá quejándose <strong>en</strong> cualquier conflicto de tipos. Esto siempre ha sido<br />
importante, pero es especialm<strong>en</strong>te importante <strong>en</strong> <strong>C++</strong> ya que d<strong>en</strong>tro de las estructuras<br />
puede hacer métodos. Si <strong>en</strong> <strong>C++</strong> estuviera permitido pasar punteros a estructuras<br />
con impunidad <strong>en</strong> cuanto a conflicto de tipos, ¡podría terminar llamando a un método<br />
de una estructura <strong>en</strong> la cual no existiera dicha función miembro! Una verdadera<br />
fórmula para el desastre. Así, mi<strong>en</strong>tras <strong>C++</strong> sí deja asignar cualquier puntero a un<br />
void * (<strong>en</strong> realidad este es el propósito original del puntero a void: que sea sufici<strong>en</strong>tem<strong>en</strong>te<br />
largo como para apuntar a cualquier tipo) no permite asignar un void * a<br />
cualquier otro tipo de puntero. Para ello se requiere un molde que le indique tanto<br />
al lector como al compilador que realm<strong>en</strong>te quiere tratarlo como el puntero destino.<br />
Y esto nos lleva a discutir un asunto interesante. Uno de los objetivos importantes<br />
de <strong>C++</strong> es poder compilar la mayor cantidad posible de código C para así, permitir<br />
una fácil transición al nuevo l<strong>en</strong>guaje. Sin embargo, eso no significa, como se ha<br />
visto que cualquier segm<strong>en</strong>to de código que sea válido <strong>en</strong> C, será permitido automáticam<strong>en</strong>te<br />
<strong>en</strong> <strong>C++</strong>. Hay varias cosas que un compilador de C permite hacer que son<br />
pot<strong>en</strong>cialm<strong>en</strong>te peligrosas y prop<strong>en</strong>sas a g<strong>en</strong>erar errores (verá ejemplos de a lo largo<br />
de libro). El compilador de <strong>C++</strong> g<strong>en</strong>era errores y avisos <strong>en</strong> este tipo de situaciones<br />
y como verá eso es más una v<strong>en</strong>taja que un obstáculo a pesar de su naturaleza restrictiva.<br />
¡De hecho, exist<strong>en</strong> muchas situaciones <strong>en</strong> las cuales tratará de detectar sin<br />
éxito un error <strong>en</strong> C y cuando recompiles el programa con un compilador de <strong>C++</strong> éste<br />
avisa exactam<strong>en</strong>te de la causa del problema!. En C, muy a m<strong>en</strong>udo ocurre que para<br />
que un programa funcione correctam<strong>en</strong>te, además de compilarlo, luego debe hacer<br />
que ande. ¡En <strong>C++</strong>, por el contrario, verá que muchas veces si un programa compila<br />
correctam<strong>en</strong>te es probable que funcione bi<strong>en</strong>! Esto se debe a que este último l<strong>en</strong>guaje<br />
es mucho más estricto respecto a la comprobación de tipos.<br />
En el sigui<strong>en</strong>te programa de prueba podrá apreciar cosas nuevas con respecto a<br />
cómo se utiliza la nueva versión de la Stash:<br />
//: C04:CppLibTest.cpp<br />
//{L} CppLib<br />
// Test of <strong>C++</strong> library<br />
#include "CppLib.h"<br />
#include "../require.h"<br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
int main() {<br />
Stash intStash;<br />
intStash.initialize(sizeof(int));<br />
for(int i = 0; i < 100; i++)<br />
intStash.add(&i);<br />
for(int j = 0; j < intStash.count(); j++)<br />
cout