Attention! Your ePaper is waiting for publication!
By publishing your document, the content will be optimally indexed by Google via AI and sorted into the right category for over 500 million ePaper readers on YUMPU.
This will ensure high visibility and many readers!
función. Aunque podría definir varias funciones sobrecargadas operator() con<br />
difer<strong>en</strong>tes argum<strong>en</strong>tos, a m<strong>en</strong>udo se usa para tipos que solo ti<strong>en</strong><strong>en</strong> una operación<br />
simple, o al m<strong>en</strong>os una especialm<strong>en</strong>te destacada. En el Volum<strong>en</strong>2 verá que la Librería<br />
Estándar de <strong>C++</strong> usa el operador de llamada a función para crear «objetos-función».<br />
Para crear un operator->* debe primero crear una clase con un operator(-<br />
) que sea el tipo de objeto que operator->* devolverá. Esta clase debe, de algún<br />
modo, capturar la información necesaria para que cuando operator() sea llamada<br />
(lo que sucede automáticam<strong>en</strong>te), el puntero a miembro sea indireccionado para el<br />
objeto. En el sigui<strong>en</strong>te ejemplo, el constructor de FunctionObject captura y almac<strong>en</strong>a<br />
el puntero al objeto y el puntero a la función miembro, y <strong>en</strong>tonces operator()<br />
los usa para hacer la verdadera llamada puntero a miembro:<br />
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 352 — #390 ✐ Capítulo 12. Sobrecarga de operadores Obj* operator->() const { require(oc.a[index] != 0, "Zero value " "returned by SmartPointer::operator->()"); return oc.a[index]; } }; // Function to produce a smart pointer that // points to the beginning of the ObjContainer: SmartPointer begin() { return SmartPointer(*this); } }; int main() { const int sz = 10; Obj o[sz]; ObjContainer oc; for(int i = 0; i < sz; i++) oc.add(&o[i]); // Fill it up ObjContainer::SmartPointer sp = oc.begin(); do { sp->f(); // Pointer derefer<strong>en</strong>ce operator call sp->g(); } while(++sp); } ///:~ Además del anidami<strong>en</strong>to de la clase, hay solo dos difer<strong>en</strong>cias aquí. La primera es la declaración de la clase para que pueda ser fri<strong>en</strong>d: class SmartPointer; fri<strong>en</strong>d SmartPointer; El compilador debe saber primero que la clase existe, antes de que se le diga que es «amiga». La segunda difer<strong>en</strong>cia es <strong>en</strong> ObjContainer donde el método begin() produce el SmartPointer que apunta al principio de la secu<strong>en</strong>cia del ObjContainer. 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 habitual de la librería estándar de <strong>C++</strong>. Operador ->* El operador ->* es un operador binario que se comporta como todos los otros operadores binarios. Se proporciona para aquellas situaciones <strong>en</strong> las que quiera imitar el comportami<strong>en</strong>to producido por la sintaxis incorporada puntero a miembro, descrita <strong>en</strong> el capitulo anterior. Igual que operator->, el operador de indirección de puntero a miembro se usa normalm<strong>en</strong>te con alguna clase de objetos que repres<strong>en</strong>tan un «puntero intelig<strong>en</strong>te», aunque el ejemplo mostrado aquí será más simple para que sea compr<strong>en</strong>sible. El truco cuando se define operator->* es que debe devolver un objeto para el que operator() pueda ser llamado con los argum<strong>en</strong>tos para la función miembro que usted llama. La llamada a función operator() debe ser un método, y es único <strong>en</strong> que permite cualquier número de argum<strong>en</strong>tos. Hace que el objeto parezca realm<strong>en</strong>te una 352 ✐ ✐ ✐ ✐
✐ ✐ ✐ “Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 353 — #391 ✐ 12.3. Operadores sobrecargables función. Aunque podría definir varias funciones sobrecargadas operator() con difer<strong>en</strong>tes argum<strong>en</strong>tos, a m<strong>en</strong>udo se usa para tipos que solo ti<strong>en</strong><strong>en</strong> una operación simple, o al m<strong>en</strong>os una especialm<strong>en</strong>te destacada. En el Volum<strong>en</strong>2 verá que la Librería Estándar de <strong>C++</strong> usa el operador de llamada a función para crear «objetos-función». Para crear un operator->* debe primero crear una clase con un operator(- ) que sea el tipo de objeto que operator->* devolverá. Esta clase debe, de algún modo, capturar la información necesaria para que cuando operator() sea llamada (lo que sucede automáticam<strong>en</strong>te), el puntero a miembro sea indireccionado para el objeto. En el sigui<strong>en</strong>te ejemplo, el constructor de FunctionObject captura y almac<strong>en</strong>a el puntero al objeto y el puntero a la función miembro, y <strong>en</strong>tonces operator() los usa para hacer la verdadera llamada puntero a miembro: //: C12:PointerToMemberOperator.cpp #include using namespace std; class Dog { public: int run(int i) const { cout