• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Konstruktor kopiujący w klasie pochodnej klasy abstrakcyjnej

+1 głos
83 wizyt
pytanie zadane 15 listopada 2016 w C i C++ przez użytkownika Kasztan Dyskutant (7,980 punkty)
zamknięte 17 listopada 2016 przez użytkownika Kasztan
class abstr
{
private:
	string fname;
	string lname;
	string job;
public:
	abstr() : fname("Brak"), lname("Brak"), job("Brak") {}
	abstr(const string & fn, const string & ln, const string & j) : fname(fn), lname(ln), job(j) {}
	virtual void ShowAll() const;
	virtual void SetAll();
	friend ostream & operator<<(ostream & os, const abstr & e); // wyswietla imie i nazwisko
	virtual ~abstr() = 0 {}
};

class manager : virtual public abstr {
private:
	int inchargeof;
protected:
	int InChargeOf() const { return inchargeof; }
	int & InChargeOf() { return inchargeof; }
public:
	manager() : abstr() {}
	manager(const string & fn, const string & ln, const string & j, int ico = 0) : abstr(fn, ln, j), inchargeof(ico) {}
	manager(const abstr & e, int ico) : abstr(e), inchargeof(ico) {}
	manager(const manager & m); // ten konstruktor
	virtual void ShowAll() const;
	virtual void SetAll();
};

Moje pytanie jak będzie wyglądała definicja tego konstruktora jak mam się dostawać do składowych klasy wirtualnej ?

manager(const manager & m);

 

 

komentarz zamknięcia: Uzyskałem odpowiedź

3 odpowiedzi

0 głosów
odpowiedź 16 listopada 2016 przez użytkownika Criss Szeryf (91,300 punkty)
wybrane 17 listopada 2016 przez użytkownika Kasztan
 
Najlepsza

Ale po co chcesz się dostawać do składowych "klasy wirtualnej" (w cudzysłowie bo raczej właściwsze by było "wirtualnego rodzica" czy coś takiego) ? Są prywatne, więc to niemożliwe. Druga sprawa, że w konstruktorze to raczej niepotrzebne.

Powinien wyglądać tak:

manager(const manager & m) : abstr(m), inchargeof(m.inchargeof) {}

Btw. po co to =0 przy destruktorze?

0 głosów
odpowiedź 15 listopada 2016 przez użytkownika Ehlert Maniak (73,190 punkty)
  1. Zrób gettery w klasie abstrakcyjnej
  2. = 0 to oznacz że niema ciała, więc je wywal
  3. Abstrakcyjna ma jeden konstruktor za dużo. Zrób jeden z argumentami defaultowymi.
komentarz 15 listopada 2016 przez użytkownika Kasztan Dyskutant (7,980 punkty)
A da się inaczej ? bez tych getterów ?
komentarz 15 listopada 2016 przez użytkownika adrian17 Szeryf (78,620 punkty)

= 0 to oznacz że niema ciała, więc je wywal

Nie tylko może mieć ciało, ale w przypadku destruktora klasy bazowej wręcz musi mieć ciało, nawet, jeśli jest oznaczony jako metoda abstrakcyjna.

(plus to, jak jest zdefiniowany, technicznie nie jest legalne - GCC i Clang by nie przepuściło "=0 {}". Definicja powinna być osobno.)

komentarz 16 listopada 2016 przez użytkownika Criss Szeryf (91,300 punkty)

= 0 to oznacz że niema ciała, więc je wywal

Tak jak napisał adrian.

= 0 wymusza implementacje w klasie dziedziczącej, ale to nie oznacza, że taka metoda nie może mieć ciała w klasie bazowej. 

0 głosów
odpowiedź 15 listopada 2016 przez użytkownika Kasztan Dyskutant (7,980 punkty)
I jak mam użyć tych getterów w definicji tego konstruktora ? Getter będzie mi zwracał składową i jak mam ją przypisać do drugiego obiektu ?

Mam zrobić listę inizjalizacyjną i w konstruktorze klasy abstr wywoływać gettery po przecinku ??
komentarz 16 listopada 2016 przez użytkownika Kasztan Dyskutant (7,980 punkty)
Podpowie ktoś jak to zrobić ?
komentarz 16 listopada 2016 przez użytkownika Kasztan Dyskutant (7,980 punkty)
?????

Podobne pytania

0 głosów
2 odpowiedzi 78 wizyt
pytanie zadane 9 sierpnia 2016 w C i C++ przez użytkownika SebekMakaron Użytkownik (960 punkty)
0 głosów
4 odpowiedzi 238 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez użytkownika Piotr21 Nowicjusz (190 punkty)
0 głosów
1 odpowiedź 64 wizyt
pytanie zadane 13 lutego 2016 w C i C++ przez użytkownika Ziuziek Gaduła (3,570 punkty)
...