w3 friend i etykiety(1)

background image

Wykład 2

Przeciw pełnej

hermetyzacji

background image

Ukrywanie informacji - etykiety

private i public

Jeśli klasa ma etykietę private, to jej składniki będą dostępne tylko
w zakresie wnętrza klasy. Jeśli etykiet nie ma, to w trybie
domyślnym wszystkie składniki klasy są private
. Są lokalne w
zakresie ważności klasy. Jeśli etykieta jest public, to składniki klasy
mogą być wywoływane także spoza tej klasy. Etykietami możemy
określać także dostęp do wybranych składników klasy wybiórczo
umieszczając etykietę przed nazwą składnika klasy. Wtedy private i
public mają sens podany wyżej. Dodatkowo stosuje się także etykietę
protected. Oznacza ona, że taki składnik jest dostępny tylko w
ramach dziedziczenia tj. w klasach, które są potomkami klasy
zawierającej ten składnik.
Tak więc etykiety właśnie zapewniają nam ochronę dostępu do
składników klasy. Dane najczęściej umieszczamy w klasach
chronionych czyli private. Do ustawiania wartości i pobierania
danych korzystamy z funkcji składowych klasy. To do nich stosujemy
etykiety ochrony. Etykiety te są jednym z narzędzi hermetyzacji
klasy.

background image

Przykład:
class chamidlo
{
int a;
float b;
void fun1(int);
protected:
char m;
void fun2(void);

public:

int v;

void fun3(char*);
private:

int d;
void fun4(float b);

}
 
W tej klasie składniki prywatne, czyli dostępne tylko w obrębie

klasy chamidlo to: a,b,fun1,d, fun4. Składniki protected, czyli
zastrzeżone dla tej klasy i jej potomków to: m,fun2. Pozostałe
składniki są publiczne, czyli dostępne dla wszystkich elementów
programu. Są to: v, fun3.

background image

Funkcje zaprzyjaźnione

 
To takie funkcje, które, mimo, że nie są składnikami klasy, to

mają dostęp do jej składników czyli innych funkcji, zmiennych i
obiektów. Mają dostęp także do tych składników klasy, które są
hermetyzowane etykietą private. Pamiętajmy, że jeśli nie ma innych
etykiet, to wszystkie składniki są private. Funkcja zaprzyjaźniona
jest wprowadzana instrukcją friend.

 

Sposób stosowania:
class figura{
 
int x,y;
…….
friend void goniec(figura&)
};

background image

Sama funkcja goniec(figura&) jest zdefiniowana gdzieś w
programie w całkowicie innym miejscu nie powiązanym z
klasą pionek. W klasie figura {} chcemy z niej skorzystać
nawet, jeśli przynależy ona do innej klasy. Wtedy poprawnie
jest taką funkcję zaznaczyć etykietą public w jej klasie.
 
Cechy funkcji zaprzyjaźnionych:
*Funkcja może być zaprzyjaźniona z kilkoma klasami.
*Na argumentach jej wywołania może wykonywać operacje
zgodnie ze swoją definicją.
*Może być napisana w zupełnie innym języku niż C++ i
dlatego może nie być funkcją składową klasy.

background image

*Ponieważ funkcja typu friend nie jest składnikiem klasy to nie ma
wskaźnika this, czyli musi się posłużyć operatorem wskaźnika, albo
przypisania aby wykonać działania (także te na składniku klasy, z
którą jest zaprzyjaźniona).
*Jest deklarowana w klasie ze słowem instrukcji friend i nie
podlega
etykietom hermetyzcji (public, private, protected).
*Może być cała zdefiniowana w klasie i wtedy jest typu inline ale
nadal jest funkcją zaprzyjaźnioną.
*Nie musi być funkcją składową żadnej klasy ale może nią być.
*Klasa może się przyjaźnić z wieloma funkcjami, które są lub nie są
składnikami innych klas.
*Funkcje zaprzyjaźnione nie są przechodnie, to znaczy, że „przyjaciel
mego przyjaciela nie jest moim przyjacielem” czyli zaprzyjaźnienie
nie przenosi się od klasy do klasy.
*Zaprzyjaźnienie nie podlega mechanizmowi dziedziczenia.
*Z zasady umieszcza się funkcje zaprzyjaźnione na początku
wszystkich deklaracji w klasie.

background image

Zaprzyjaźnienie klas

#include <string>
using namespace std;
class Pies {

string kolor, przedmiot;

int wiek; friend class Kot;

public:

Pies(string, int, string); void drukuj();

void zamien(Kot *);
};
class Kot { string kolor, przedmiot; int wiek;
friend class Pies;
public:

Kot(string, int, string); void drukuj();

void zamien(Pies *);
void clear() { przedmiot=""; }
};

background image

Zaprzyjaźnienie klas cd.1

Pies::Pies(string aKolor, int aWiek, string aPrzedmiot)
{

• kolor = aKolor;

• wiek = aWiek;

• przedmiot = aPrzedmiot;
}

Kot::Kot(string aKolor, int aWiek, string aPrzedmiot)
{

• kolor = aKolor;

• wiek = aWiek;

• przedmiot = aPrzedmiot;
}

background image

Zaprzyjaźnienie klas cd.2

• void Pies::zamien(Kot *b)

• {

• string old = b->przedmiot;

• b->przedmiot = przedmiot;

• przedmiot = old;

• }

• void Kot::zamien(Pies *b)

• {

• string old = b->przedmiot;

• b->przedmiot = przedmiot;

• przedmiot = old;

• }

background image

Zaprzyjaźnienie klas cd.3

• void

• Pies::drukuj()

• {

• printf("Kolor [%s], wiek [%d], przedmiot [%s]\n",

kolor.c_str(), wiek,

• przedmiot.c_str());

• }

• void

• Kot::drukuj()

• {

• printf("Kolor [%s], wiek [%d], przedmiot [%s]\n",

kolor.c_str(), wiek,

• przedmiot.c_str());

• }

background image

Zaprzyjaźnienie klas cd.4

int main(int argc, char* argv[])
{

• Pies a("czarny", 3, "kosc"); Kot b("bialy", 5, "pilka");

• a.drukuj(); b.drukuj();

• printf("\nZamiana...\n\n"); a.zamien(&b); a.drukuj();

b.drukuj();

• printf("\nA zabiera B...\n\n"); a.zamien(&b); b.clear();

• a.drukuj(); b.drukuj();

• printf("\n"); system("PAUSE");

return 0;

}

background image

Cechy zaprzyjaźniania klas

• W klasie możemy deklarować przyjaźń z

funkcjami składowymi innej klasy bez ograniczeń.
Oznacza to, że obiekty klasy zaprzyjaźnionej i jej
składniki otrzymują dostęp do wszystkich – także
prywatnych – skłąadników klasy zaprzyjaźnionej.

• Jedną klasę możemy zaprzyjaźnić z wieloma

innymi klasami.

• Przyjaźń nie jest przechodnia.
• Zaprzyjaźnianie klas jest wyłączone z procesu

dziedziczenia, czyli zaprzyjaźnienie nie jest
dziedziczone.


Document Outline


Wyszukiwarka

Podobne podstrony:
eksperyment etykietowanie W3
eksperyment etykietowanie W3
Systemy Bezprzewodowe W3
Gospodarka W3
w3 skrócony
AM1 w3
w3 recykling tworzyw sztucznych
Finansowanie W3
W2 i W3
so w3
UE W3 cut
W3 Elastycznosc popytu i podazy
reprod w3 2008
W3 Sprawozdawczosc
W3 Opakowania
zsf w3 pdf

więcej podobnych podstron