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