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 350 — #388<br />
✐<br />
Capítulo 12. Sobrecarga de operadores<br />
class SmartPointer {<br />
ObjContainer& oc;<br />
int index;<br />
public:<br />
SmartPointer(ObjContainer& objc) : oc(objc) {<br />
index = 0;<br />
}<br />
// Return value indicates <strong>en</strong>d of list:<br />
bool operator++() { // Prefix<br />
if(index >= oc.a.size()) return false;<br />
if(oc.a[++index] == 0) return false;<br />
return true;<br />
}<br />
bool operator++(int) { // Postfix<br />
return operator++(); // Use prefix version<br />
}<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 />
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 />
SmartPointer sp(oc); // Create an iterator<br />
do {<br />
sp->f(); // Pointer derefer<strong>en</strong>ce operator call<br />
sp->g();<br />
} while(sp++);<br />
} ///:~<br />
La clase Obj define los objetos que son manipulados <strong>en</strong> este programa. Las funciones<br />
f() y g() simplem<strong>en</strong>te escrib<strong>en</strong> <strong>en</strong> pantalla los valores interesantes usando<br />
miembros de datos estáticos. Los punteros a estos objetos son almac<strong>en</strong>ados <strong>en</strong><br />
el interior de los cont<strong>en</strong>edores del tipo ObjContainer usando su función add().<br />
ObjContanier parece un array de punteros, pero advertirá que no hay forma de<br />
traer de nuevo los punteros. Sin embargo, SmartPointer se declara como una clase<br />
fri<strong>en</strong>d, así que ti<strong>en</strong>e permiso para mirar d<strong>en</strong>tro del cont<strong>en</strong>edor. La clase Smart-<br />
Pointer se parece mucho a un puntero intelig<strong>en</strong>te - puede moverlo hacia adelante<br />
usando operator++ (también puede definir un operator--, no pasará del final<br />
del cont<strong>en</strong>edor al que apunta, y g<strong>en</strong>era (a través del operador de indireccion de<br />
punteros) el valor al que apunta. Advierta que SmartPointer está hecho a medida<br />
sobre el cont<strong>en</strong>edor para el que se crea; a difer<strong>en</strong>cia de un puntero normal, no hay<br />
punteros intelig<strong>en</strong>tes de «propósito g<strong>en</strong>eral». Apr<strong>en</strong>derá más sobre los punteros intelig<strong>en</strong>tes<br />
llamados «iteradores» <strong>en</strong> el último capitulo de este libro y <strong>en</strong> el volum<strong>en</strong><br />
2 (descargable desde FIXME:url www. BruceEckel. com).<br />
En main(), una vez que el cont<strong>en</strong>edor oc se rell<strong>en</strong>a con objetos Obj se crea un<br />
SmartPointer sp. La llamada al puntero intelig<strong>en</strong>te sucede <strong>en</strong> las expresiones:<br />
sp->f();<br />
// Llamada al puntero intelig<strong>en</strong>te<br />
350<br />
✐<br />
✐<br />
✐<br />
✐