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 509 — #547<br />

✐<br />

16.7. Introducción a los iteradores<br />

template T* Stack::pop() {<br />

if(head == 0) return 0;<br />

T* result = head->data;<br />

Link* oldHead = head;<br />

head = head->next;<br />

delete oldHead;<br />

return result;<br />

}<br />

#<strong>en</strong>dif // TSTACK2_H ///:~<br />

Hay que hacer notar que la clase ha sido cambiada para soportar la posesión,<br />

que funciona ahora debido a que la clase conoce ahora el tipo exacto (o al m<strong>en</strong>os<br />

el tipo base, que funciona asumi<strong>en</strong>do que son usados los destructores virtuales). La<br />

opción por defecto es que el cont<strong>en</strong>edor destruya sus objetos pero nosotros somos<br />

responsables de los objetos a los que se haga pop().<br />

El iterador es simple, y físicam<strong>en</strong>te muy pequeño - el tamaño de un único puntero.<br />

Cuando se crea un iterator, se inicializa a la cabeza de la lista <strong>en</strong>lazada, y<br />

sólo puede ser increm<strong>en</strong>tado avanzando a través de la lista. Si se quiere empezar<br />

desde el principio, hay que crear un nuevo iterador, y si se quiere recordar un punto<br />

de la lista, hay que crear un nuevo iterador a partir del iterador exist<strong>en</strong>te que está<br />

apuntando a ese elem<strong>en</strong>to (usando el constructor de copia del iterador).<br />

Para llamar a funciones del objeto refer<strong>en</strong>ciado por el iterador, se puede usar<br />

la función curr<strong>en</strong>t(), el operator*, o la desrefer<strong>en</strong>cia de puntero operator--<br />

> (un elem<strong>en</strong>to común <strong>en</strong> los iteradores). La última ti<strong>en</strong>e una implem<strong>en</strong>tación que<br />

parece idéntica a curr<strong>en</strong>t() debido a que devuelve un puntero al objeto actual,<br />

pero es difer<strong>en</strong>te porque el operador desrefer<strong>en</strong>cia del puntero realiza niveles extra<br />

de desrefer<strong>en</strong>ciación (ver Capítulo 12).<br />

La clase iterator sigue el formato que se vio <strong>en</strong> el ejemplo anterior. class<br />

iterator está anidada d<strong>en</strong>tro de la clase cont<strong>en</strong>edora, conti<strong>en</strong>e constructores<br />

para crear un iterador que apunta a un elem<strong>en</strong>to <strong>en</strong> el cont<strong>en</strong>edor y un iterador<br />

«marcador de final», y la clase cont<strong>en</strong>edora ti<strong>en</strong>e los métodos begin() y <strong>en</strong>d(-<br />

) para producir estos iteradores. (Cuando apr<strong>en</strong>da más de la Librería Estándar de<br />

<strong>C++</strong>, verá que los nombres iterator, begin() y <strong>en</strong>d() que se usan aquí ti<strong>en</strong><strong>en</strong><br />

correspondecia <strong>en</strong> las clases cont<strong>en</strong>edoras. Al final de este capítulo, se verá que esto<br />

permite manejar estas clases cont<strong>en</strong>edoras como si fueran clases de la STL).<br />

La implem<strong>en</strong>tación completa se <strong>en</strong>cu<strong>en</strong>tra <strong>en</strong> el archivo cabecera, por lo que no<br />

existe un archivo cpp separado. Aquí t<strong>en</strong>emos un pequeño test que usa el iterador.<br />

//: C16:TStack2Test.cpp<br />

#include "TStack2.h"<br />

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

#include <br />

#include <br />

#include <br />

using namespace std;<br />

int main() {<br />

ifstream file("TStack2Test.cpp");<br />

assure(file, "TStack2Test.cpp");<br />

Stack textlines;<br />

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

string line;<br />

509<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!