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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 324 — #362<br />

✐<br />

Capítulo 11. Las refer<strong>en</strong>cias y el constructor de copia<br />

sigui<strong>en</strong>te ejemplo:<br />

//: C11:SimpleStructure.cpp<br />

struct Simple { int a; };<br />

int main() {<br />

Simple so, *sp = &so;<br />

sp->a;<br />

so.a;<br />

} ///:~<br />

Ahora suponga que ti<strong>en</strong>e un puntero normal que se llama ip y que apunta a un<br />

<strong>en</strong>tero. Para acceder a lo que apunta ip, ha de estar precedido por un ’*’:<br />

*ip=4;<br />

Finalm<strong>en</strong>te, se preguntará qué pasa si ti<strong>en</strong>e un puntero que está apuntando a<br />

algo que está d<strong>en</strong>tro de un objeto, incluso si lo que realm<strong>en</strong>te repres<strong>en</strong>ta es un desplazami<strong>en</strong>to<br />

d<strong>en</strong>tro del objeto. Para acceder a lo que está apuntando, debe preceder<br />

el puntero con ’*’. Pero como es un desplazami<strong>en</strong>to d<strong>en</strong>tro de un objeto, también ha<br />

de referirse al objeto con el que estamos tratando. Así, el * se combina con el objeto.<br />

Por tanto, la nueva sintaxis se escribe ->* para un puntero que apunta a un objeto, y<br />

.* para un objeto o refer<strong>en</strong>cia, tal como esto:<br />

objectPointer->*pointerToMember = 47;<br />

object.*pointerToMember = 47;<br />

Pero, ¿cuál es la sintaxis para definir el pointerToMember Pues como cualquier<br />

puntero, ti<strong>en</strong>e que decir el tipo al que apuntará, por lo que se utilizaría el ’*’ <strong>en</strong><br />

la definición. La única difer<strong>en</strong>cia es que debe decir a qué clase de objetos apuntará<br />

ese atributo puntero. Obviam<strong>en</strong>te, esto se consigue con el nombre de la clase y el<br />

operador de resolución de ámbito. Así,<br />

int ObjectClass::*pointerToMember;<br />

define un atributo puntero llamado pointerToMember que apunta a cualquier<br />

<strong>en</strong>tero d<strong>en</strong>tro de ObjectClass. También puede inicializar el puntero cuando lo<br />

defina (o <strong>en</strong> cualquier otro mom<strong>en</strong>to):<br />

int ObjectClass::*pointerToMember = &ObjectClass::a;<br />

Realm<strong>en</strong>te no existe una «dirección» de ObjectClass::a porque se está refiri<strong>en</strong>do<br />

a la clase y no a un objeto de esa clase. Así, &ObjectClass::a se puede<br />

utilizar sólo con la sintaxis de un puntero a miembro.<br />

He aquí un ejemplo que muestra cómo crear y utilizar punteros a atributos:<br />

//: C11:PointerToMemberData.cpp<br />

#include <br />

using namespace std;<br />

class Data {<br />

324<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!