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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 490 — #528<br />

✐<br />

Capítulo 16. Introducción a las Plantillas<br />

almac<strong>en</strong>ami<strong>en</strong>to.<br />

Hay que resaltar que nunca se almac<strong>en</strong>a internam<strong>en</strong>te el valor de size <strong>en</strong> la<br />

clase, pero se usa como si fuera un dato interno d<strong>en</strong>tro de las funciones miembro.<br />

16.4. Stack y Stash como Plantillas<br />

Los problemas recurr<strong>en</strong>tes de «propiedad» con las clases cont<strong>en</strong>edoras Stack<br />

y Stash (Pila y Cola respectivam<strong>en</strong>te) que han sido usadas varias veces a través<br />

del libro, vi<strong>en</strong><strong>en</strong> del hecho de que estos cont<strong>en</strong>edores no son capaces de saber exactam<strong>en</strong>te<br />

que tipo manejan. Lo más cerca que han estado es <strong>en</strong> el «cont<strong>en</strong>edor» de<br />

objectos Stack que se vio al final del capítulo 15 <strong>en</strong> OStackTest.cpp.<br />

Si el programador cli<strong>en</strong>te no elimina explícitam<strong>en</strong>te todos los punteros a objeto<br />

que están almac<strong>en</strong>ados <strong>en</strong> el cont<strong>en</strong>edor, <strong>en</strong>tonces el cont<strong>en</strong>edor debería ser capaz<br />

de eliminar esos punteros de manera adecuada. Es decir, el cont<strong>en</strong>edor «posee» cualquiera<br />

de los objetos que no hayan sido eliminados, y es el responsable de limpiarlos.<br />

La dificultad radica <strong>en</strong> que el limpiado requiere conocer el tipo del objeto, y crear un<br />

cont<strong>en</strong>edor g<strong>en</strong>érico no requiere conocer el tipo de ese objeto. Con los templates, sin<br />

embargo, podemos escribir código que no conozcan el tipo de objeto, y fácilm<strong>en</strong>te<br />

instanciar una nueva versión del cont<strong>en</strong>edor por cada tipo que queramos que cont<strong>en</strong>ga.<br />

La instancia cont<strong>en</strong>edora individual conoce el tipo de objetos que maneja y<br />

puede por tanto llamar al destructor correcto (asumi<strong>en</strong>do que se haya proporcionado<br />

un destructor virtual).<br />

Para la pila es bastante s<strong>en</strong>cillo debido a todas las funciones miembro pued<strong>en</strong> ser<br />

introducidas <strong>en</strong> línea:<br />

//: C16:TStack.h<br />

// The Stack as a template<br />

#ifndef TSTACK_H<br />

#define TSTACK_H<br />

template<br />

class Stack {<br />

struct Link {<br />

T* data;<br />

Link* next;<br />

Link(T* dat, Link* nxt):<br />

data(dat), next(nxt) {}<br />

}* head;<br />

public:<br />

Stack() : head(0) {}<br />

~Stack(){<br />

while(head)<br />

delete pop();<br />

}<br />

void push(T* dat) {<br />

head = new Link(dat, head);<br />

}<br />

T* peek() const {<br />

return head head->data : 0;<br />

}<br />

T* pop(){<br />

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

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

490<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!