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 384 — #422<br />

✐<br />

Capítulo 13. Creación dinámica de objetos<br />

tero a objeto almac<strong>en</strong>ado <strong>en</strong> el cont<strong>en</strong>edor. El cont<strong>en</strong>edor no puede realizar la limpieza<br />

para los punteros que almac<strong>en</strong>a puesto que son punteros void*. Esto puede<br />

derivar <strong>en</strong> un serio problema si a un cont<strong>en</strong>edor se le pasan punteros a objetos automáticos<br />

junto con punteros a objetos dinámicos; el resultado de usar delete sobre<br />

un puntero que no haya sido obt<strong>en</strong>ido del montículo es imprevisible. Más aún, al<br />

obt<strong>en</strong>er del cont<strong>en</strong>edor un puntero cualquiera, existirán dudas sobre el orig<strong>en</strong>, automático,<br />

dinámico o estático, del objeto al que apunta. Esto implica que hay que<br />

asegurarse del orig<strong>en</strong> dinámico de los punteros que se almac<strong>en</strong><strong>en</strong> <strong>en</strong> la sigui<strong>en</strong>te<br />

versión de Stash y Stack, bi<strong>en</strong> sea mediante una programación cuidadosa, o bi<strong>en</strong><br />

por la creación de clases que sólo puedan ser construidas <strong>en</strong> el montículo.<br />

Es muy importante asegurarse también de que el programador cli<strong>en</strong>te se responsabilice<br />

de la limpieza de los punteros del cont<strong>en</strong>edor. Se ha visto <strong>en</strong> ejemplos<br />

anteriores que la clase Stack comprobaba <strong>en</strong> su destructor que todos los objetos<br />

Link habían sido desapilados. Un objeto Stash para punteros requiere un modo<br />

difer<strong>en</strong>te de abordar el problema.<br />

13.2.3. Stash para punteros<br />

Esta nueva versión de la clase Stash, que llamamos PStash, almac<strong>en</strong>a punteros<br />

a objetos exist<strong>en</strong>tes <strong>en</strong> el montículo, a difer<strong>en</strong>cia de la vieja versión, que guardaba<br />

una copia por valor de los objetos. Usando new y delete, es fácil y seguro almac<strong>en</strong>ar<br />

punteros a objetos creados <strong>en</strong> el montículo.<br />

He aquí el archivo de cabecera para «Stash para punteros»:<br />

//: C13:PStash.h<br />

// Holds pointers instead of objects<br />

#ifndef PSTASH_H<br />

#define PSTASH_H<br />

class PStash {<br />

int quantity; // Number of storage spaces<br />

int next; // Next empty space<br />

// Pointer storage:<br />

void** storage;<br />

void inflate(int increase);<br />

public:<br />

PStash() : quantity(0), storage(0), next(0) {}<br />

~PStash();<br />

int add(void* elem<strong>en</strong>t);<br />

void* operator[](int index) const; // Fetch<br />

// Remove the refer<strong>en</strong>ce from this PStash:<br />

void* remove(int index);<br />

// Number of elem<strong>en</strong>ts in Stash:<br />

int count() const { return next; }<br />

};<br />

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

Los elem<strong>en</strong>tos de datos subyac<strong>en</strong>tes no han cambiado mucho, pero ahora el almac<strong>en</strong>ami<strong>en</strong>to<br />

se hace sobre un vector de punteros void, que se obti<strong>en</strong>e mediante<br />

new <strong>en</strong> lugar de malloc(). En la expresión<br />

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

384<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!