Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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