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 497 — #535<br />
✐<br />
16.5. Activando y desactivando la propiedad<br />
que cada posición debería saber cuando es necesario ser destruido; esto es una variante<br />
del conteo de refer<strong>en</strong>cias, excepto <strong>en</strong> que es el cont<strong>en</strong>edor y no el objeto el que<br />
conoce el número de refer<strong>en</strong>cias a un objeto.<br />
//: C16:OwnerStack.h<br />
// Stack with runtime conrollable ownership<br />
#ifndef OWNERSTACK_H<br />
#define OWNERSTACK_H<br />
template 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 />
bool own;<br />
public:<br />
Stack(bool own = true) : head(0), own(own) {}<br />
~Stack();<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 />
bool owns() const { return own; }<br />
void owns(bool newownership) {<br />
own = newownership;<br />
}<br />
// Auto-type conversion: true if not empty:<br />
operator bool() const { return head != 0; }<br />
};<br />
template T* Stack::pop() {<br />
if(head == 0) return 0;<br />
T* result = head->data;<br />
Link* oldHead = head;<br />
head = head->next;<br />
delete oldHead;<br />
return result;<br />
}<br />
template Stack::~Stack() {<br />
if(!own) return;<br />
while(head)<br />
delete pop();<br />
}<br />
#<strong>en</strong>dif // OWNERSTACK_H ///:~<br />
El comportami<strong>en</strong>to por defecto del cont<strong>en</strong>edor consiste <strong>en</strong> destruir sus objetos<br />
pero se puede cambiar o modificando el argum<strong>en</strong>to del constructor o usando las<br />
funciones miembro de owns().<br />
Como con la mayoría de las plantillas que se verán, la implem<strong>en</strong>tación <strong>en</strong>tera se<br />
497<br />
✐<br />
✐<br />
✐<br />
✐