Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziedziczenie konstruktora oraz inicjalizacja - dziedziczony atrybut jest ignorowany

Ostatnio zmodyfikowano 2021-06-26 19:52
Autor Wiadomość
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
C/C++
public:
string imie;
string nazwisko;
explicit Osoba( const std::string imie = "brak", const std::string nazwisko = "brak" );
virtual ~Osoba();

Osoba.cpp
C/C++
Osoba::Osoba( const string imie, const string nazwisko )
{
   
this->imie = move( imie );
   
this->nazwisko = move( nazwisko );
}

Osoba::~Osoba() = default;


Pacjent.h
C/C++
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
C/C++
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?

P-178792
» 2021-06-26 17:15:16
Podaj kompletny kod, który reprodukuje problem.
P-178793
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:

C/C++
Pacjent pacjent15( "1996.12.28", 5, "bc345", "rak", "Bozena", "Kot" );
std::string wynik;
pacjent15.testowanie() = wynik;
std::cout << wynik;
P-178794
» 2021-06-26 19:20:18
C/C++
std::string wynik;
pacjent15.testowanie() = wynik;
std::cout << wynik;
Wypisujesz pusty wynik, bo nie zmieniasz wartości tej zmiennej.
P-178795
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ę:
C/C++
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
C/C++
Osoba( std::string imie, std::string nazwisko );

virtual ~Osoba();

Osoba.cpp
C/C++
Osoba::Osoba( std::string imie, std::string nazwisko )
{
   
this->imie =( imie );
   
this->nazwisko =( nazwisko );
}

Osoba::~Osoba() = default;


Pacjent.h
C/C++
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
C/C++
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;

P-178796
» 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.
P-178797
« 1 »
  Strona 1 z 1