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

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

Saved successfully!

Ooh no, something went wrong!