Dichiarazioni friend
In taluni casi e` desiderabile che una funzione non membro possa accedere direttamente
ai membri (attributi e/o metodi) privati di una classe. Tipicamente questo accade
quando si realizzano due o piu` classi, distinte tra loro, che devono cooperare
per l'espletamento di un compito complessivo e si vogliono ottimizzare al massimo
le prestazioni, oppure semplicemente quando ad esempio si desidera eseguire
l'overloading degli operatori ostream& operator<<(ostream&
o, T& Obj) e istream& operator>>(istream&
o, T& Obj) per estendere le operazioni di I/O alla classe
T che si vuole realizzare. In situazioni di questo genere, una
classe puo` dichiarare una certa funzione friend (amica)
abilitandola ad accedere ai propri membri privati.
Il seguente esempio mostra come eseguire l'overloading dell'operatore di inserzione
in modo da poter visualizzare il contenuto di una nuova classe:
#include < iostream >
using namespace std;
class MyClass {
public:
/* ... */
private:
float F1, F2;
char C;
void Func();
/* ... */
friend ostream& operator<<(ostream& o, MyClass& Obj);
};
void MyClass::Func() {
/* ... */
}
// essendo stato dichiarato friend dentro MyClass, il
// seguente operatore puo` accedere ai membri privati
// della classe come una qualunque funzione membro.
ostream& operator<<(ostream& o, MyClass& Obj) {
o << Obj.F1 << ' ' << Obj.F2 << ' ' << Obj.C;
return o;
}
in tal modo diviene possibile scrivere:
MyClass Object;
/* ... */
cout << Object;
L'esempio comunque risultera` meglio comprensibile quando parleremo di overloading
degli operatori, per adesso e` sufficiente considerare ostream&
operator<<(ostream& o, MyClass& Obj) alla stessa
stregua di una qualsiasi funzione.
La keyword friend puo` essere applicata anche a un identificatore
di classe, abilitando cosi` una classe intera
class MyClass {
/* ... */
friend class AnotherClass;
};
in tal modo qualsiasi membro di AnotherClass puo` accedere ai dati
privati di MyClass .
Si noti infine che deve essere la classe proprietaria dei membri privati a dichiarare
una funzione (o una classe) friend e che non ha importanza la sezione
(pubblica, protetta o privata) in cui tale dichiarazione e` fatta.
|