CzaryLasu Temat założony przez niniejszego użytkownika |
Dziedziczenie konstruktora oraz inicjalizacja - dziedziczony atrybut jest ignorowany » 2021-06-26 16:20:21 Klasą bazową jest Osoba o parametrach "imię", "nazwisko", a pochodną - Pacjent, który dziedziczy te parametry i dodaje swoje. Coś najwyraźniej robię nie tak z dziedziczeniem, bo "imię" i "nazwisko" nie są pomyślnie inicjalizowane. Załączam wybrane fragmenty: Osoba.h public: string imie; string nazwisko; explicit Osoba( const std::string imie = "brak", const std::string nazwisko = "brak" ); virtual ~Osoba();
Osoba.cpp Osoba::Osoba( const string imie, const string nazwisko ) { this->imie = move( imie ); this->nazwisko = move( nazwisko ); }
Osoba::~Osoba() = default;
Pacjent.h explicit Pacjent( std::string dataUrodzenia = "nie podano", int dniPobytu = 1, std::string numerKsiegiGlownej = "nie podano", std::string rozpoznanie = "brak", const std::string & imie = "imie", const std::string & nazwisko = "nazwisko" ); std::string testowanie(); virtual ~Pacjent();
virtual ~Pacjent();
Pacjent.cpp Pacjent::Pacjent( std::string dataUrodzenia, int dniPobytu, std::string numerKsiegiGlownej, std::string rozpoznanie, const std::string & imie, const std::string & nazwisko ) : Osoba( imie, nazwisko ) { this->dataUrodzenia = std::move( dataUrodzenia ); this->dniPobytu = dniPobytu; this->numerKsiegiGlownej = std::move( numerKsiegiGlownej ); this->rozpoznanie = std::move( rozpoznanie ); this->imie = imie; this->nazwisko = nazwisko; }
std::string Pacjent::testowanie() { return nazwisko; }
Pacjent::~Pacjent() = default;
Może rzuca się komuś w oczy ten (prawdopodobnie) oczywisty błąd? |
|
pekfos |
» 2021-06-26 17:15:16 Podaj kompletny kod, który reprodukuje problem. |
|
CzaryLasu Temat założony przez niniejszego użytkownika |
» 2021-06-26 17:50:16 zedytowałam post, a tutaj fragment main gdzie próbuję sprawdzić, czy się udało: Pacjent pacjent15( "1996.12.28", 5, "bc345", "rak", "Bozena", "Kot" ); std::string wynik; pacjent15.testowanie() = wynik; std::cout << wynik;
|
|
pekfos |
» 2021-06-26 19:20:18 std::string wynik; pacjent15.testowanie() = wynik; std::cout << wynik; Wypisujesz pusty wynik, bo nie zmieniasz wartości tej zmiennej. |
|
CzaryLasu Temat założony przez niniejszego użytkownika |
» 2021-06-26 19:33:53 dlaczego? metoda testowanie() zwraca "nazwisko", które przypisuję do "wyniku", co jest w takim razie nie tak? zrobiłam inaczej, przez referencję: std::string Pacjent::testowanie( std::string & wwynik ) { wwynik = nazwisko; return wwynik; }
i jest ok, choć nie rozumiem, dlaczego to nie może działać z użyciem tamtego sposobu a mam drugie pytanie: jak nie zainicjalizowałam "nazwiska", pole zostało zainicjalizowane konstruktorem domyślnym klasy pochodnej, jednak tworząc konstruktor klasy bazowej kompilator wymagał, żeby tam też podać wartości domyślne, tak też zrobiłam, ale chyba nie jest to zbyt eleganckie? konstruktor klasy pochodnej też wymagał podania domyślnych parametrów : ( trochę pozmieniałam i działa, chyba jest OK. Osoba.h Osoba( std::string imie, std::string nazwisko );
virtual ~Osoba();
Osoba.cpp Osoba::Osoba( std::string imie, std::string nazwisko ) { this->imie =( imie ); this->nazwisko =( nazwisko ); }
Osoba::~Osoba() = default;
Pacjent.h Pacjent( std::string dataUrodzenia = "nie podano", int dniPobytu = 1, std::string numerKsiegiGlownej = "nie podano", std::string rozpoznanie = "brak", std::string imie = "imie", std::string nazwisko = "nazwisko" );
virtual ~Pacjent();
Pacjent.cpp Pacjent::Pacjent( std::string dataUrodzenia, int dniPobytu, std::string numerKsiegiGlownej, std::string rozpoznanie, std::string imie, std::string nazwisko ) : Osoba( imie, nazwisko ) { this->dataUrodzenia = std::move( dataUrodzenia ); this->dniPobytu = dniPobytu; this->numerKsiegiGlownej = std::move( numerKsiegiGlownej ); this->rozpoznanie = std::move( rozpoznanie ); this->imie = imie; this->nazwisko = nazwisko; } Pacjent::~Pacjent() = default;
|
|
pekfos |
» 2021-06-26 19:52:52 nie rozumiem, dlaczego to nie może działać z użyciem tamtego sposobu Przypisanie ma kierunek i to było jedyne miejsce w kodzie, gdzie zapisałaś je odwrotnie. tworząc konstruktor klasy bazowej kompilator wymagał, żeby tam też podać wartości domyślne, tak też zrobiłam, ale chyba nie jest to zbyt eleganckie? Podaj kod i komunikat kompilatora. |
|
« 1 » |