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

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
Autor Wiadomość
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?

C/C++
#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 ); //jeżeli tego tutaj nie dam, to funkcja nie ma dostępu do private string 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 ]->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; //to nie działa, jeżeli nie dodam tego zaprzyjaźnienia co wyżej
        out << doktor.listaPacjentow[ 0 ]->odczytajImie(); //to zawsze działa OK
        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;
}
P-151881
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.
C/C++
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; // to powinno być private
   
    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:
C/C++
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<>
P-151888
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 ;)
P-151918
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++)
P-151923
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.
P-151932
« 1 »
  Strona 1 z 1