Forum Gry Hobby Sprzęt Rozmawiamy Archiwum Regulamin

Forum: C++ - dziedziczenie, konstruktor kopiujacy

11.04.2012 22:33
😊
1
pajkul
93
Senator

C++ - dziedziczenie, konstruktor kopiujacy

Witam.

Problem jest nastepujacy. Mam klase bazowa A ze skladnikami prywatnymi, tworze sobie klase pochodną B.
W klasie B musze zdefiniowac konstruktor kopiujacy. Najwazniejsze pola obiektow klasy B sa polami zadeklarowanymi w sekcji private klasy A. Jak utworzyc konstruktor kopiujacy, ktory skopiuje tez pola sekcji private? Bo normalnie tego w konstruktorze kopiujacym zrobic nie moge, jedyne wyjscie jakie przyszlo mi do glowy to zaprzyjaznienie klasy B z klasa A, ale nie watpie czy to dobry pomysl.

11.04.2012 22:34
Loczek
2
odpowiedz
Loczek
160
El Loco Boracho

Zamiast pól private używasz protected.

11.04.2012 22:38
3
odpowiedz
pajkul
93
Senator

Aha, te pola MUSZA byc private!

Tak, po prostu musza byc private i tyle.

11.04.2012 22:42
Loczek
4
odpowiedz
Loczek
160
El Loco Boracho

Czemu muszą być private? Pól prywatnych się nie dziedziczy.

Protected rozszerza scope pól prywatnych na klasy dziedzicząc (w uproszczeniu protected = private + możliwość dziedziczenia).

Chyba, że masz jakoś sztucznie narzucone ograniczenia - wtedy nie wiem, nie znam C++ :P

11.04.2012 23:09
Wooler
5
odpowiedz
Wooler
81
Konsul

A przyjaźń samego konstruktora kopiującego z klasą? (chyba da się zaprzyjaźnić konstruktor? W sumie nigdy nie potrzebowałem tego robić więc nie wiem)

Loczek - klasa pochodna dziedziczy pola prywatne ale nie ma do nich dostępu.

11.04.2012 23:26
Loczek
6
odpowiedz
Loczek
160
El Loco Boracho

Wooler: "tomato, tomejto... :P". Jak wspomniałem, nie znam C++ i jego niuansów, ale wychodzi na to samo ;)

12.04.2012 19:26
7
odpowiedz
pajkul
93
Senator

Jakies pomysly? Moze moge w jakis sposob wywolac konstruktor kopiujacy klasy bazowej w konstruktorze kopiujacym klasy pochodnej? Tzn tak, zeby skopiowal to co jest private w klasie bazowej, a reszte elementow bedacych public w klasie pochodnej skopiowac normalnie.

12.04.2012 19:38
master53
8
odpowiedz
master53
100
Legend
19.04.2012 06:26
9
odpowiedz
Justynka__
1
Junior
Image

Cześć !
Mam problem z podobnej dziedziny.
Tworzę proxy - klasa bazowa i klasa proxy dziedzicząca.
Klasa dziedzicząca ma w liście inicjalizacyjnej konstruktora przypisać parametr do pola klasy bazowej.
Niestety, nie działa.
Poniżej zamieszczam kod; fragment hpp i cpp.
W zdjęciu po prawej print z błędami.

HPP///////////////////////////////////////
class DaneStat

public:
DaneStat ();
// zwraca referencje na przechowywane dane
virtual const std::vector <float> &dane () const = 0;
virtual ~DaneStat () ‹›;
virtual const std::string &nazwa () const; // zwraca nazwe pliku
protected:
std::string nazwa_; // nazwa pliku
›;

// proxy - wczytuje prawdziwy obiekt przy pierwszym uĹĽyciu

class DaneStatProxy : public DaneStat

public:
DaneStatProxy(std::string nazwa);
// zwraca referencje na przechowywane dane
virtual ~DaneStatProxy ();
virtual const std::vector <float> &dane () const;
virtual void wczytaj (std::istream &is, std::ostream &os);
protected:
DaneStatProxy *dane_proxy_;

›;

CPP///////////////////////////////////////

DaneStat::DaneStat () ‹› // w tej nie inicjalizujmy
//DaneStat::~DaneStat () ‹›
//DaneStat::dane () const ‹›
//DaneStat::&nazwa () const ‹return nazwa_;›

DaneStatProxy::DaneStatProxy(std::string nazwa) : DaneStat::nazwa_(nazwa), dane_proxy_(NULL) ‹›
DaneStatProxy::~DaneStatProxy () ‹delete dane_proxy_;›
DaneStatProxy DaneStatProxy::dane() const ‹return &dane_proxy_;›
DaneStatProxy::nazwa() const ‹return &nazwa_;›
DaneStatProxy::wczytaj (std::istream &is, std::ostream &os)

if(!dane_proxy_) dane_proxy_ = new DaneStatReal(&nazwa);
dane_proxy_->wczytaj(is, os);

Forum: C++ - dziedziczenie, konstruktor kopiujacy