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 263 — #301<br />

✐<br />

9.3. Stash y Stack con inlines<br />

Este es el mismo programa de prueba que se usó antes, de modo que la salida<br />

debería ser básicam<strong>en</strong>te la misma.<br />

La clase Stack incluso hace mejor uso de inline’s.<br />

//: C09:Stack4.h<br />

// With inlines<br />

#ifndef STACK4_H<br />

#define STACK4_H<br />

#include "../require.h"<br />

class Stack {<br />

struct Link {<br />

void* data;<br />

Link* next;<br />

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

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

}* head;<br />

public:<br />

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

~Stack() {<br />

require(head == 0, "Stack not empty");<br />

}<br />

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

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

}<br />

void* peek() const {<br />

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

}<br />

void* pop() {<br />

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

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

Link* oldHead = head;<br />

head = head->next;<br />

delete oldHead;<br />

return result;<br />

}<br />

};<br />

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

Note que el destructor Link, que se pres<strong>en</strong>tó (vacío) <strong>en</strong> la versión anterior de<br />

Stack, ha sido eliminado. En pop(), la expresión delete oldHead simplem<strong>en</strong>te<br />

libera la memoria usada por Link (no destruye el objeto data apuntado por el Link).<br />

La mayoría de las funciones inline quedan bastante bi<strong>en</strong> obviam<strong>en</strong>te, <strong>en</strong> especial<br />

para Link. Incluso pop() parece justificado, aunque siempre que haya s<strong>en</strong>t<strong>en</strong>cias<br />

condicionales o variables locales no está claro que las inlines sean b<strong>en</strong>eficiosas. Aquí,<br />

la función es lo sufici<strong>en</strong>tem<strong>en</strong>te pequeña así que es probable que no haga ningún<br />

daño.<br />

Si todas sus funciones son inline, usar la librería se convierte <strong>en</strong> algo bastante<br />

simple porque el <strong>en</strong>lazado es innecesario, como puede ver <strong>en</strong> el ejemplo de prueba<br />

(fíjese <strong>en</strong> que no hay Stack4.cpp).<br />

263<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!