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 513 — #551<br />

✐<br />

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

template<br />

void PStash::inflate(int increase) {<br />

const int tsz = sizeof(T*);<br />

T** st = new T*[quantity + increase];<br />

memset(st, 0, (quantity + increase) * tsz);<br />

memcpy(st, storage, quantity * tsz);<br />

quantity += increase;<br />

delete []storage; // Old storage<br />

storage = st; // Point to new memory<br />

}<br />

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

La mayoría de este archivo es un traducción prácticam<strong>en</strong>te directa del anterior<br />

PStash y el iterador anidado d<strong>en</strong>tro de un template. Esta vez, sin embargo, el<br />

operador devuelve refer<strong>en</strong>cias al iterador actual, la cual es una aproximación más<br />

típica y flexible.<br />

El destructor llama a delete para todos los punteros que conti<strong>en</strong>e, y como el<br />

tipo es obt<strong>en</strong>ido de la plantilla, se ejecutará la destrucción adecuada. Hay que estar<br />

precavido que si el cont<strong>en</strong>edor controla punteros al tipo de la clase base, este tipo<br />

debe t<strong>en</strong>er un destructor virtual para asegurar un limpiado adecuado de los<br />

objetos derivados que hayan usado un upcast cuando se los alojó <strong>en</strong> el cont<strong>en</strong>edor.<br />

El PStash::iterator manti<strong>en</strong>e el modelo de <strong>en</strong>gancharse a un único objeto<br />

cont<strong>en</strong>edor durante su ciclo de vida. Además, el constructor de copia permite<br />

crear un nuevo iterador que apunte a la misma posición del iterador desde el que se<br />

le creo, creando de esta manera un marcador d<strong>en</strong>tro del cont<strong>en</strong>edor. Las funciones<br />

miembro operator+= y el operator-= permit<strong>en</strong> mover un iterador un número<br />

de posiciones, mi<strong>en</strong>tras se respet<strong>en</strong> los límites del cont<strong>en</strong>edor. Los operadores sobrecargados<br />

de increm<strong>en</strong>to y decrem<strong>en</strong>to muev<strong>en</strong> el iterador una posición. El operator+<br />

produce un nuevo iterador que se mueve adelante la cantidad añadida. Como<br />

<strong>en</strong> el ejemplo anterior, los operadores de desrefer<strong>en</strong>cia de punteros son usados para<br />

manejar el elem<strong>en</strong>to al que el iterador está refer<strong>en</strong>ciando, y remove() destruye el<br />

objeto actual llamando al remove() del cont<strong>en</strong>edor.<br />

Se usa la misma clase de código de antes para crear el marcador final: un segundo<br />

constructor, la función miembro del cont<strong>en</strong>edor <strong>en</strong>d(), y el operator== y operator!=<br />

para comparaciones.<br />

El sigui<strong>en</strong>te ejemplo crea y comprueba dos difer<strong>en</strong>tes clases de objetos Stash,<br />

uno para una nueva clase llamada Int que anuncia su construcción y destrucción y<br />

otra que gestiona objetos string de la librería Estándar.<br />

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

#include "TPStash2.h"<br />

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

#include <br />

#include <br />

#include <br />

using namespace std;<br />

class Int {<br />

int i;<br />

public:<br />

Int(int ii = 0) : i(ii) {<br />

513<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!