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

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

Saved successfully!

Ooh no, something went wrong!