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