Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Enkapsulacja(hermetyzacja) klasy

Ostatnio zmodyfikowano 2016-05-27 23:32
Autor Wiadomość
ninja1234
Temat założony przez niniejszego użytkownika
[C++] Enkapsulacja(hermetyzacja) klasy
» 2016-05-27 13:18:58
Witam , w jaki mogę uzyskać dostęp do prywatnych pól klasy Komputer?

C/C++
#include <cstdlib>
#include <iostream>

using namespace std;
class Komputer {
   
   
    float czestotliwosc;
    int pojemnoscDysku, iloscPamieci;
    string procesor, kartaGraficzna;
public:
    Komputer();
   
    Komputer( string procesor, string kartaGraficzna, int pojemnoscDysku, int iloscPamieci, float czestotliwosc );
   
    friend istream & operator <<( istream & wyjscie, Komputer k );
    friend ostream & operator >>( ostream & wejscie, const Komputer & k );
   
};

Komputer::Komputer() {
   
    procesor = "";
    kartaGraficzna = "";
    pojemnoscDysku = 0;
    iloscPamieci = 0;
    czestotliwosc = 0;
}
Komputer::Komputer( string Procesor, string kartaGraficzna, int pojemnoscDysku, int iloscPamieci, float czestotliwosc )
{
    this->procesor = procesor;
    this->kartaGraficzna = kartaGraficzna;
    this->pojemnoscDysku = pojemnoscDysku;
    this->iloscPamieci = iloscPamieci;
    this->czestotliwosc = czestotliwosc;
}

ostream & operator <<( ostream & wyjscie, const Komputer k )
{
   
    wyjscie << "Parametry komputera: \nProcesor: " << k.procesor << endl;
    wyjscie << "Karta graficzna: " << k.kartaGraficzna << endl;
    wyjscie << "Czestotliwosc procesora : " << k.czestotliwosc << endl;
    wyjscie << "Pojemnosc dysku  : " << k.pojemnoscDysku << endl;
    wyjscie << "Ilosc pamieci  : " << k.iloscPamieci << endl;
    return wyjscie;
   
}
istream & operator >>( istream & wejscie, Komputer & k ) {
   
    cout << "Podaj kolejno parametry komputera:" << endl;
    cout << "Procesor: ";
    wejscie >> k.procesor;
    cout << "Karta graficzna: ";
    wejscie >> k.kartaGraficzna;
   
    do
    {
        cout << "Czestotliwosc procesora: ";
        wejscie >> k.czestotliwosc;
    } while( k.czestotliwosc <= 0 );
   
   
    do
    {
        cout << "Pojemnosc dysku: ";
        wejscie >> k.pojemnoscDysku;
    } while( k.pojemnoscDysku <= 0 );
   
   
    do
    {
        cout << "Ilosc pamieci : ";
        wejscie >> k.iloscPamieci;
    } while( k.iloscPamieci <= 0 );
   
    return wejscie;
}
P-148609
carlosmay
» 2016-05-27 13:25:19
w jaki mogę uzyskać dostęp do prywatnych pól klasy Komputer?
Napisać gettery zwracające zawartość prywatnych składowych.

C/C++
class Foo
{
    int a_;
public:
    Foo( int a = 5 )
        : a_
    { a } { }
    int getA() const { return a_; }
}

auto main()->int
{
    Foo foo();
    std::cout << foo.getA() << '\n';
}

... lub inne metody operujące na prywatnych składowych.

Co konkretnie chcesz osiągnąć?
P-148610
ninja1234
Temat założony przez niniejszego użytkownika
» 2016-05-27 13:41:04
zabezpieczyć wartości przed zmiana, wg idei hermetyzacji klasy
czyli na pewno nie gettery i settery bo ponoć "łamią" enkapsulacje
P-148611
carlosmay
» 2016-05-27 14:08:02
zabezpieczyć wartości przed zmiana, wg idei hermetyzacji klasy
Używać modyfikatora
const
 wobec obiektu, na którym pracujemy (jak wyżej).

np:
C/C++
int Foo::exp() const
{
    int result = this->a_ * this->a_; // ok
    this->a_ += 2; // błąd, bo obiekt jest const
    return result;
}
P-148612
ninja1234
Temat założony przez niniejszego użytkownika
» 2016-05-27 14:37:17
w przypadku funkcji friend ostream& operator >> (ostream &wejscie, Komputer &k) nie jest raczej możliwe użycie modyfikatora const, problem w tym ze przy wyświetlaniu za pomoca friend istream& operator << (istream &wyjscie,const Komputer k);
w sumie tez nie dziala
P-148613
carlosmay
» 2016-05-27 14:53:20
w przypadku funkcji friend ostream& operator<<
Obiekt przekazujesz const.

Jeśli chcesz pełnej hermetyzacji, ustawianiem pól prywatnych powinien zajmować się tylko konstruktor.
Modyfikacji pól mogą dokonywać tylko wewnętrzne metody. Najczęściej prywatne.
Udostępniasz użytkownikowi tylko taki interfejs jaki uznajesz za konieczny.
Pełna hermetyzacja zakłada brak dostępu do pól prywatnych z zewnątrz.

Edit: Operuj na całych obiektach.
P-148614
carlosmay
» 2016-05-27 15:00:31
w sumie tez nie dziala
Zamienione są operatory.
P-148615
ninja1234
Temat założony przez niniejszego użytkownika
» 2016-05-27 15:12:34
friend istream& operator << (istream &wyjscie,const Komputer k);przy takim zapisie
 pole dalej jest widziane jako prywatne
P-148616
« 1 » 2
  Strona 1 z 2 Następna strona