Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐