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

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

Saved successfully!

Ooh no, something went wrong!