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 165 — #203<br />

✐<br />

4.8. Estructuras anidadas<br />

Esto apila eficazm<strong>en</strong>te el Link <strong>en</strong> la cima de la lista.<br />

Stack::pop() captura el puntero data <strong>en</strong> la cima actual de la Stack; <strong>en</strong>tonces<br />

mueve el puntero head hacia abajo y borra la anterior cima de la Stack, finalm<strong>en</strong>te<br />

devuelve el puntero capturado. Cuando pop() elemina el último elem<strong>en</strong>to, head<br />

vuelve a ser cero, indicando que la Stack está vacía.<br />

Stack::cleanup() realm<strong>en</strong>te no hace ninguna limpieza. En su lugar, establece<br />

una política firme que dice «el programador cli<strong>en</strong>te que use este objeto Stack es<br />

responsable de des-apilar todos los elem<strong>en</strong>tos y borrarlos». require() se usa para<br />

indicar que ha ocurrido un error de programación si la Stack no está vacía.<br />

¿Por qué no puede el destructor de Stack responsabilizarse de todos los objetos<br />

que el programador cli<strong>en</strong>te no des-apiló El problema es que la Stack está usando<br />

punteros void, y tal como se verá <strong>en</strong> el Capítulo 13 usar delete para un void*<br />

no libera correctam<strong>en</strong>te. El asunto de «quién es el responsable de la memoria» no<br />

siempre es s<strong>en</strong>cillo, tal como veremos <strong>en</strong> próximos capítulos.<br />

Un ejemplo para probar la Stack:<br />

//: C04:StackTest.cpp<br />

//{L} Stack<br />

//{T} StackTest.cpp<br />

// Test of nested linked list<br />

#include "Stack.h"<br />

#include "../require.h"<br />

#include <br />

#include <br />

#include <br />

using namespace std;<br />

int main(int argc, char* argv[]) {<br />

requireArgs(argc, 1); // File name is argum<strong>en</strong>t<br />

ifstream in(argv[1]);<br />

assure(in, argv[1]);<br />

Stack textlines;<br />

textlines.initialize();<br />

string line;<br />

// Read file and store lines in the Stack:<br />

while(getline(in, line))<br />

textlines.push(new string(line));<br />

// Pop the lines from the Stack and print them:<br />

string* s;<br />

while((s = (string*)textlines.pop()) != 0) {<br />

cout

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

Saved successfully!

Ooh no, something went wrong!