czy zaprzyjaźniona funkcja z zaprzyjaźnionej klasy może mieć dostęp do prywatnych zmiennych z klasy bazowej
Ostatnio zmodyfikowano 2016-09-22 23:40
pozdro600 Temat założony przez niniejszego użytkownika |
czy zaprzyjaźniona funkcja z zaprzyjaźnionej klasy może mieć dostęp do prywatnych zmiennych z klasy bazowej » 2016-09-21 14:09:46 Podobnie jak w temacie. Jeżeli klasa bazowa przyjaźni się z drugą klasą, a druga klasa przyjaźni się z funkcją, to czy zawsze muszę dodawać zaprzyjaźnienie funkcji także do klasy bazowej, aby ta mogła odczytywać prywatne zmienne z klasy bazowej? #include <iostream> #include <vector> using namespace std;
class Doktor;
class Pacjent { private: string m_imie; public: Pacjent( string imie ) : m_imie( imie ) { }; string odczytajImie() { return m_imie; } friend class Doktor; friend ostream & operator <<( ostream & out, const Doktor & doktor ); };
class Doktor { private: string m_imie; public: Doktor( string imie ) : m_imie( imie ) { }; vector < Pacjent *> listaPacjentow; void dodajPacjenta( Pacjent * pacjent ) { listaPacjentow.push_back( pacjent ); cout << listaPacjentow[ 0 ]->m_imie << " zostal zapisany na wizyte u doktora. " << endl; } friend ostream & operator <<( ostream & out, const Doktor & doktor ) { out << doktor.m_imie << " widzi sie z pacjetem " << endl; out << doktor.listaPacjentow[ 0 ]->m_imie << endl; out << doktor.listaPacjentow[ 0 ]->odczytajImie(); return out; } };
int main() { Pacjent * p1 = new Pacjent( "Pacjent 1" ); Doktor * d1 = new Doktor( "Doktor 1" ); d1->dodajPacjenta( p1 ); cout << * d1 << endl; delete p1; delete d1; return 0; }
|
|
karambaHZP |
» 2016-09-21 18:39:50 Jeżeli klasa bazowa przyjaźni się z drugą klasą, a druga klasa przyjaźni się z funkcją, to czy zawsze muszę dodawać zaprzyjaźnienie funkcji także do klasy bazowej, aby ta mogła odczytywać prywatne zmienne z klasy bazowej? |
Dokładniej opisuj problem. friend class jest całkiem zbędne. Każda klasa powinna mieć interfejs, poprzez który korzystamy z tej klasy. Jeśli nie chcesz korzystać z interfejsu, korzystaj ze struct Pacjent Wg mnie to wystarczy. class Pacjent { private: string m_imie; public: Pacjent( string imie ) : m_imie( imie ) { }; string odczytajImie() { return m_imie; } };
class Doktor { private: string m_imie; public: Doktor( string imie ) : m_imie( imie ) { }; vector < Pacjent *> listaPacjentow; void dodajPacjenta( Pacjent * pacjent ) { listaPacjentow.push_back( pacjent ); cout << listaPacjentow[ 0 ]->odczytajImie() << " zostal zapisany na wizyte u doktora. " << endl; } friend ostream & operator <<( ostream & out, const Doktor & doktor ) { out << doktor.m_imie << " widzi sie z pacjetem " << doktor.listaPacjentow[ 0 ]->odczytajImie(); return out; } }; Przkład 2: class Pacjent { private: string m_imie; public: Pacjent( string imie ) : m_imie( imie ) { }; friend ostream & operator <<( ostream & out, const Pacjent & pacjent ) { out << pacjent.m_imie; return out; } };
class Doktor { private: string m_imie; vector < Pacjent *> listaPacjentow; public: Doktor( string imie ) : m_imie( imie ) { }; void dodajPacjenta( Pacjent * pacjent ) { listaPacjentow.push_back( pacjent ); cout << * listaPacjentow[ 0 ] << " zostal zapisany na wizyte u doktora." << '\n'; } friend ostream & operator <<( ostream & out, const Doktor & doktor ) { out << doktor.m_imie << " widzi sie z pacjentem " << * doktor.listaPacjentow[ 0 ]; return out; } }; W C++ używanie gołych new i delete to antyidiom. Korzystaj z inteligentnych wskaźników: std::unique_ptr lub std::shared_ptr . Linki: std::shared_ptr<>std::unique_ptr<> |
|
Kaikso |
» 2016-09-22 20:24:56 Bez przesady, nie ma potrzeby w każdym miejscu używać inteligentnych wskaźników, ludzie też bywają inteligentni ;) |
|
karambaHZP |
» 2016-09-22 22:17:36 Bez przesady, nie ma potrzeby w każdym miejscu używać inteligentnych wskaźników, ludzie też bywają inteligentni ;) |
Nawet najinteligentniejsi popełniają błędy, których one pilnują. Smart Pointers (Modern C++) |
|
Kaikso |
» 2016-09-22 23:40:53 Tak, ale jaki jest sens korzystać z nich w trywialnych sytuacjach, gdzie przebieg operacji alokacji i dealokacja jest linowy? W takich sytuacjach shared_ptr jest ociążały, a unique_ptr zawiły (ma zbyt wiele ograniczeń - Porady: tworzenie wystąpień unique_ptr i korzystanie z nich). Tu całkowicie swobodne, surowe wskaźniki są najlepszym rozwiązaniem. |
|
« 1 » |