Przyjaźń

2016-10-27 20:56
Jacek Labudda
												Przyjaźnią nazywamy relację pomiędzy klasami, strukturami, czy też funkcjami.
Od razu na wstępie informuje, że ta lekcja nie należy do najprostszych.
Jeśli nigdy nie miałeś styczności z programowaniem obiektowym, to zapewne przeczytasz ją kilka razy zanim wszystko zrozumiesz.

W niniejszej lekcji będziemy posługiwać się nowym słowem kluczowym friend(ang. przyjaciel).

Klasy zaprzyjaźnione

Deklaracja przyjaźni klas wygląda następująco:
class Klasa1{ public: //... }; class Klasa2{ public: friend class Klasa1; //... };
Najważniejszym elementem w powyższym kodzie jest
friend class Klasa1;
Mówi kompilatorowi, że klasa Klasa1 ma swobodny dostęp do danych klasy Klasa2. Działa to jednak tylko w jednym kierunku. W przypadku, gdyby klasa Klasa2 przyjaźniła się klasą Klasa3
class Klasa1{ public: //... }; class Klasa2{ public: friend class Klasa1; //... }; class Klasa3{ public: friend class Klasa2; //... };
to klasa Klasa1 NIE przyjaźni się z klasą Klasa3 pomimo takowej relacji z klasą Klasa2.

Przykład użycia zaprzyjaźnionych klas

#include <iostream> using namespace std; //deklaracja klas class Klasa2; class Klasa1{ public: void przekaz(Klasa2 & kl2, string tekst); }; class Klasa2{ string tekst; public: friend class Klasa1; //deklaracja przyjazni klas void wypisz(){ cout << tekst; } }; //definicja funkcji void Klasa1::przekaz(Klasa2 & kl2, string tekst){ kl2.tekst = "Wiadomosc: " + tekst; } int main(){ Klasa1 kl1; Klasa2 kl2; kl1.przekaz(kl2, "wartosc zdefiniowana!"); kl2.wypisz(); return 0; }
Wynik: Wiadomosc: wartosc zdefiniowana! Stworzyliśmy dwie klasy Klasa1 i Klasa2, które się przyjaźnią. Klasa1 posiada jedną metodę, która definiuje wartość zmiennej tekst będącą elementem klasy Klasa2. Poprzez referencje zostaje przekazany obiekt o nazwie kl2 typu Klasa2 do funkcji przekaz(...). Mamy możliwość definiowania jego zmiennych składowych dzięki przyjaźni. Na końcu wyświetlam wynik w celu sprawdzenia poprawnego działania programu. Jak widzimy na przykładzie, dzięki przyjaźni mamy łatwy dostęp do prywatnych elementów klasy, z których w innym przypadku nie dałoby się korzystać. Przyjaźnie struktur wyglądają identycznie, więc nie będę tego przedstawiał.

Funkcje zaprzyjaźnione

Taka funkcja nie jest elementem składowym klasy czy struktury, lecz ma dostęp do wszystkich ich danych.

Przykład użycia zaprzyjaźnionych funkcji

#include <iostream> using namespace std; class Klasa{ string tekst; public: void wypisz(){ cout << "Wiadomosc: " << tekst; } friend void wprowadz(Klasa & kl, string tekst); //deklaracja zaprzyjaznionej funkcji }; void wprowadz(Klasa & kl, string tekst){ kl.tekst = tekst; } int main(){ Klasa kl; wprowadz(kl, "wartosc zdefiniowana!"); kl.wypisz(); return 0; }
Wynik: Wiadomosc: wartosc zdefiniowana! Stworzyliśmy klasę o nazwie Klasa w której zadeklarowaliśmy zaprzyjaźnioną funkcję wprowadz(...). Definicja tej funkcji znajduje się pod klasą i definiuje ona wartość zmiennej tekst będącą prywatnym elementem klasy. Im dalej w las tym więcej drzew jak to mówią.

Zadanie:

Sprawdź swoją wiedzę. Stwórz 3 klasy o nazwie Osoba1, Osoba2 oraz Osoba3. Osoba1 przyjaźni się z Osoba2, a Osoba2 przyjaźni się z Osoba3. Osoba3 otrzymała jakąś rzecz, a Osoba1 chce ją od niej pożyczyć, lecz się z nią nie przyjaźni, więc prosi o to Osobe2, aby pożyczyła dla niej. Napisz taki program, aby Osoba1 otrzymała tą rzecz od Osoby3 bez zaprzyjaźniania się. Ta rzecz ma być elementem prywatnym! Powodzenia. Jeśli nie udało się tobie wykonać zadania bez pomocy, to przeczytaj powyższą lekcję od początku. Rozwiązanie

Użytkownicy
Logowanie:
Zaloguj
Polub nas na facebooku
Wyszukiwanie na stronie