Prijatelji klasa

  • Ponekad je potrebno da klasa ima i "povlašćene" korisnike koji mogu da pristupaju njenim privatnim članovima.

  • Povlašćeni korisnici su funkcije (globalne ili članice drugih klasa) ili cele klase.

  • Takve funkcije i klase nazivaju se prijateljima (engl. friends).

  • Prijateljstvo se ne nasleđuje, nije simetrična i nije tranzijentna relacija.


Prijateljske funkcije

  • Prijateljske funkcije su funkcije koje nisu članice klase, ali imaju pristup do privatnih članova klase.

  • Prijateljske funkcije mogu da budu globalne funkcije ili članice drugih klasa.

  • Funkcija je prijateljska ako se u definiciji klase navede deklaracija funkcije sa ključnom reči friend ispred.

  • Nevažno je da li se deklaracija prijateljske funkcije navodi u privatnom ili javnom delu klase.


class X {
friend void
g(int,X&); // prijateljska globalna funkcija
friend void
Y::h(); // prijateljska članica h druge klase Y
int
i;
public:

void
f(int ip) { i=ip;}
}


void
g(int k, X &x) {
x.i = k; // prijateljska finkcija moze da pristupa

} // privatnim clanovima klase


void
Main() {
X x;

x.f(5); // postavljanje preko clanice

g(6,x); // postavljanej preko prijatelja

}

  • Prijateljska funkcija nema pokazivač this na objekat klase kojoj je prijatelj.

  • Prijateljstvo je relacija koja reguliše pravo pristupa, a ne oblast važenja i vidljivost identifikatora.

  • Funkcija može da bude prijatelj većem broju klasa istovremeno.

Prijateljske klase

  • Ako su sve funkcije članice klase Y prijateljske funkcije klasi X, onda je Y prijateljska klasa (friend class) klasi X.

class X {
friend
Y; // ako je klasa Y definisana ili deklarisana
friend class
Z; // ako klasa Z jos nije definisana ni deklarisana
}
  • Sve funkcije članice klase Y mogu da pristupaju privatnim članovima klase X.

  • Prijateljske klase se tipično koriste kada neke dve klase imaju tešnje međusobne veze.

  • Na primer, na sledeći način može se obezbediti da samo klasa Kreator može da kreira objekte klase X:

class X {
private:

friend class
Kreator;
X(); // konstruktor je dostupan samo klasi Kreator
};

friend - ovo se može koristiti u C++ , ali ne u C#  !!!  - a treba da znate 

Last modified: Monday, 4 November 2019, 2:27 PM