• 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
109 wizyt
pytanie zadane 15 listopada 2016 w C i C++ przez Kasztan Dyskutant (8,180 p.)
zamknięte 17 listopada 2016 przez 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 Criss VIP (119,640 p.)
wybrane 17 listopada 2016 przez 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 Ehlert VIP (109,830 p.)
  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 Kasztan Dyskutant (8,180 p.)
A da się inaczej ? bez tych getterów ?
komentarz 15 listopada 2016 przez adrian17 VIP (105,520 p.)

= 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 Criss VIP (119,640 p.)

= 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 Kasztan Dyskutant (8,180 p.)
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 Kasztan Dyskutant (8,180 p.)
Podpowie ktoś jak to zrobić ?
komentarz 16 listopada 2016 przez Kasztan Dyskutant (8,180 p.)
?????

Podobne pytania

–1 głos
1 odpowiedź 152 wizyt
0 głosów
2 odpowiedzi 103 wizyt
0 głosów
4 odpowiedzi 456 wizyt

39,755 zapytań

78,204 odpowiedzi

153,707 komentarzy

18,801 pasjonatów

Przeglądających: 196
Pasjonatów: 16 Gości: 180

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...