Przyjaźnienie klas i atrybut private

Cześć!

Na początku wyjaśnimy definicje.

Czym jest przyjaźnienie klas ? Jest to możliwość ujrzenia prywatnych danych przez inną klasę. Co ważne, to klasa definiuje kto jest jej przyjacielem, a nie bezpośrednio klasa, która korzysta z tych dobrodziejstw korzysta.

Atrybut private - Coś prywatnego, zastrzeżonego tylko dla wybranych. W tym konkretnym przykładzie będą to atrybuty prywatne klasy.

Po co to ?

Prywatne znaczy nie dostępnego dla każdego. Nie zawsze chcemy dzielić informacje między wszystkie dostępne klasy. Wiąże się z tym zasada nie udostępniania informacji, których nie potrzebują. Listonosz, który przynosi Nam pocztę powinien wiedzieć gdzie mieszkamy, ale nie koniecznie musi wiedzieć, jakim samochodem jeździmy. Oczywiście jeśli nie jest to Fiat Multipia.

Jak to wykorzystać w programowaniu obiektowym ?

#include <iostream>

struct Set;
struct MyStruct
{
private:
int value=0;
void setValue(int v)
{
value = v;
}
public:
void showValue()
{
std::cout<<"Value equal: "<<value<<'\n';

}
friend class Set;
};

struct Set:public MyStruct
{

public:
void setPropertyValue(int v)
{
    this->setValue(v);
}
};
int main()
{

   MyStruct my;
    Set setV;
    setV.setPropertyValue(10);
     my = setV;
    my.showValue();

}

Ten kod wymaga dużo wyjaśnień. Pierwszą rzecz na jaką natrafiamy, to znacznik: struct Set
Po co to jest ? To jest znacznik dla struktury MyStruct, która nie wie jeszcze czym jest Set. Dzięki temu wie, że istnieje gdzieś dalej w kodzie i jest jej przyjacielem. Wyjaśnijmy teraz znacznik:

friend class Set;

Co to właściwie oznacza ? Że przyjaźnimy klasę w której następuje ten zapis z klasą Set. Ale uwaga. Nie oznacza to wcale, że klasa Set uważa klasę MyStruct za przyjaciela. Nie łączą jej z Nią żadne relacje, poza jednostronną wymianą.

Tak czy inaczej pozostaje jeszcze jedna kwestia do omówienia;

Co właściwie oznacza 

my = setV

?

Wywołany został tutaj tzw. operator przypisania, który przypisał wszystkie wspólne zmienne setV do klasy my. Ale uwaga! Nie zmienił adresu! Jest to bardzo ważne, gdyż gdy napisze w późniejszej części kodu coś w stylu:
   setV.setPropertyValue(15);
    my.showValue();
Nie będzie to znaczyło, że kod wyświetli Nam 15. Wyświetli wciąż 10. A o tym co zrobiliśmy w tym momencie, oraz dlaczego to działa w ten sposób, oraz jak to zmienić, będzie już w następnym przykładzie.
Do zobaczenia!

Komentarze

Popularne posty z tego bloga

Co dokładnie oznacza std::cout<<"Witaj Swiecie!"<<'\n''; w C++ ?

(LINUX)Podstawy Programowania w C++

Python import modułów