Veza između klasa (friend funkcije ili interface)
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
};