Cerca nel sito:
ricerca
avanzata

Frasi Celebri...

Quando hai perduto la testa, non piangere perche' non hai capelli.

Proverbio russo 

Sondaggio:

Come va la vita con l'Euro?

Ottimo!
Come prima
Fatico ma imparer?
Porc... che macello!

visualizza risultati


 

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.

 

successivo
–«  INDICE  »–

 

 

 

 

 
Powered by paper&pencil (carta&matita ) - Copyright © 2001-2022 Cataldo Sasso