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.
Aha, te pola MUSZA byc private!
Tak, po prostu musza byc private i tyle.
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
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.
Wooler: "tomato, tomejto... :P". Jak wspomniałem, nie znam C++ i jego niuansów, ale wychodzi na to samo ;)
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.
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);
›