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? #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; } |
|
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. 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ąć? |
|
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 |
|
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: int Foo::exp() const { int result = this->a_ * this->a_; this->a_ += 2; return result; } |
|
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 |
|
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. |
|
carlosmay |
» 2016-05-27 15:00:31 |
|
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 |
|
« 1 » 2 |