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 352 — #390<br />

✐<br />

Capítulo 12. Sobrecarga de operadores<br />

Obj* operator->() const {<br />

require(oc.a[index] != 0, "Zero value "<br />

"returned by SmartPointer::operator->()");<br />

return oc.a[index];<br />

}<br />

};<br />

// Function to produce a smart pointer that<br />

// points to the beginning of the ObjContainer:<br />

SmartPointer begin() {<br />

return SmartPointer(*this);<br />

}<br />

};<br />

int main() {<br />

const int sz = 10;<br />

Obj o[sz];<br />

ObjContainer oc;<br />

for(int i = 0; i < sz; i++)<br />

oc.add(&o[i]); // Fill it up<br />

ObjContainer::SmartPointer sp = oc.begin();<br />

do {<br />

sp->f(); // Pointer derefer<strong>en</strong>ce operator call<br />

sp->g();<br />

} while(++sp);<br />

} ///:~<br />

Además del anidami<strong>en</strong>to de la clase, hay solo dos difer<strong>en</strong>cias aquí. La primera es<br />

la declaración de la clase para que pueda ser fri<strong>en</strong>d:<br />

class SmartPointer;<br />

fri<strong>en</strong>d SmartPointer;<br />

El compilador debe saber primero que la clase existe, antes de que se le diga que<br />

es «amiga».<br />

La segunda difer<strong>en</strong>cia es <strong>en</strong> ObjContainer donde el método begin() produce<br />

el SmartPointer que apunta al principio de la secu<strong>en</strong>cia del ObjContainer.<br />

Aunque realm<strong>en</strong>te es sólo por conv<strong>en</strong>i<strong>en</strong>cia, es adecuado porque sigue la manera<br />

habitual de la librería estándar de <strong>C++</strong>.<br />

Operador ->*<br />

El operador ->* es un operador binario que se comporta como todos los otros<br />

operadores binarios. Se proporciona para aquellas situaciones <strong>en</strong> las que quiera imitar<br />

el comportami<strong>en</strong>to producido por la sintaxis incorporada puntero a miembro, descrita<br />

<strong>en</strong> el capitulo anterior.<br />

Igual que operator->, el operador de indirección de puntero a miembro se usa<br />

normalm<strong>en</strong>te con alguna clase de objetos que repres<strong>en</strong>tan un «puntero intelig<strong>en</strong>te»,<br />

aunque el ejemplo mostrado aquí será más simple para que sea compr<strong>en</strong>sible. El<br />

truco cuando se define operator->* es que debe devolver un objeto para el que<br />

operator() pueda ser llamado con los argum<strong>en</strong>tos para la función miembro que<br />

usted llama.<br />

La llamada a función operator() debe ser un método, y es único <strong>en</strong> que permite<br />

cualquier número de argum<strong>en</strong>tos. Hace que el objeto parezca realm<strong>en</strong>te una<br />

352<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!