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 174 — #212<br />

✐<br />

Capítulo 5. Ocultar la implem<strong>en</strong>tación<br />

una nueva clase y decir, «Hola, soy fri<strong>en</strong>d de Bob» y esperar ver los miembros<br />

private y protected de Bob.<br />

Puede declarar una función global como fri<strong>en</strong>d, también puede declarar un<br />

método de otra estructura, o incluso una estructura completa, como fri<strong>en</strong>d. Aquí<br />

hay un ejemplo:<br />

//: C05:Fri<strong>en</strong>d.cpp<br />

// Fri<strong>en</strong>d allows special access<br />

// Declaration (incomplete type specification):<br />

struct X;<br />

struct Y {<br />

void f(X*);<br />

};<br />

struct X { // Definition<br />

private:<br />

int i;<br />

public:<br />

void initialize();<br />

fri<strong>en</strong>d void g(X*, int); // Global fri<strong>en</strong>d<br />

fri<strong>en</strong>d void Y::f(X*); // Struct member fri<strong>en</strong>d<br />

fri<strong>en</strong>d struct Z; // Entire struct is a fri<strong>en</strong>d<br />

fri<strong>en</strong>d void h();<br />

};<br />

void X::initialize() {<br />

i = 0;<br />

}<br />

void g(X* x, int i) {<br />

x->i = i;<br />

}<br />

void Y::f(X* x) {<br />

x->i = 47;<br />

}<br />

struct Z {<br />

private:<br />

int j;<br />

public:<br />

void initialize();<br />

void g(X* x);<br />

};<br />

void Z::initialize() {<br />

j = 99;<br />

}<br />

void Z::g(X* x) {<br />

x->i += j;<br />

}<br />

void h() {<br />

X x;<br />

174<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!