Wczytywanie danych pracownika z linii poleceń

0

Cześć,
Mam problem przy stworzeniu obiektu, gdy tworzę obiekt klasy pochodnej(dziecko), odpala mi się w pierwszej kolejność konstruktor klasy bazowej(rodzica) a później dopiero efekt oczekiwany konstruktor dziecka. Nie rozumiem czemu tak się dzieje szczególnie że jeśli dobrze zrozumiałem dziedziczenie to żeby użyć konstruktora rodzica powinienem zrobić coś takiego Kierownik():Pracownik(){}? Efekt jaki chciałbym uzyskać to by przy tworzeniu się obiektu odpalił jedynie konstruktor dziecka. Z góry dziękuję jak znajdzie się ktoś kto wytłumaczy czemu tak się dzieje i powie czy da się osiągnąć przeze mnie zamierzony efekt. P.S. Mówię tu jedynie o momencie tworzenia się obiektu klasy kierownik, to że później sam tworze obiekt klasy pracownika jestem świadomy, ale nie tego to dotyczy.

Kod:

#include <iostream>

class Pracownik{
protected:
    std::string imie;
    std::string nazwisko;
    int nip;
    int dataUrodzenia;
    int dataZatrudnienia;
    int pensja;
    std::string dzial;
public:
    Pracownik(){
        std::cout<<"Podaj imie pracownika: ";
        std::cin>>imie;
        std::cout<<"Podaj nazwisko pracownika: ";
        std::cin>>nazwisko;
        std::cout<<"Podaj nip pracownika: ";
        std::cin>>nip;
        std::cout<<"Podaj date urodzenia pracownika(forma:(17052022)): ";
        std::cin>>dataUrodzenia;
        std::cout<<"Podaj date zatrudnienia pracownika(forma:(17052022)): ";
        std::cin>>dataZatrudnienia;
        std::cout<<"Podaj pensje pracownika: ";
        std::cin>>pensja;
        std::cout<<"Podaj dział pracownika: ";
        std::cin>>dzial;
    }
    virtual void wyswietlDane(){
        std::cout<<imie<<" "<<nazwisko<<" "<<dzial<<" nip: "<<nip<<std::endl<<"Data urodzenia: "<<dataUrodzenia<<std::endl<<"Zatrudniony od: "<<dataZatrudnienia<<std::endl<<"Pensja: "<<pensja<<std::endl;
    }
};

class Kierownik : public Pracownik{
protected:
    int iloscPodwladnych;
    std::string typKierownictwa;
    int dodatekFunkcyjny;
public:
    Kierownik(){
        std::cout<<"Podaj imie kierownika: ";
        std::cin>>imie;
        std::cout<<"Podaj nazwisko kierownika: ";
        std::cin>>nazwisko;
        std::cout<<"Podaj nip kierownika: ";
        std::cin>>nip;
        std::cout<<"Podaj date urodzenia kierownika(forma:(17052022)): ";
        std::cin>>dataUrodzenia;
        std::cout<<"Podaj date zatrudnienia kierownika(forma:(17052022)): ";
        std::cin>>dataZatrudnienia;
        std::cout<<"Podaj pensje kierownika: ";
        std::cin>>pensja;
        std::cout<<"Podaj dzial kierownika: ";
        std::cin>>dzial;
        std::cout<<"Podaj ilosc podwladnych kierownika: ";
        std::cin>>iloscPodwladnych;
        std::cout<<"Podaj typ kierownictwa: ";
        std::cin>>typKierownictwa;
        std::cout<<"Podaj dodatek funkcyjny kierownika: ";
        std::cin>>dodatekFunkcyjny;
    }
    void wyswietlDane(){
        std::cout<<typKierownictwa<<std::endl;
        Pracownik::wyswietlDane();
        std::cout<<"Dodatek funkcyjny: "<<dodatekFunkcyjny<<std::endl<<"Liczba podwladnych: "<<iloscPodwladnych<<std::endl;
    }
    Pracownik* zatrudnijPracownika(){
        ++iloscPodwladnych;
        Pracownik * Jacus = new Pracownik;
        return Jacus;
    }
};

int main(){
    Kierownik szefuncio;
    Pracownik * Jacus = szefuncio.zatrudnijPracownika();
    Jacus -> wyswietlDane();
}

Edit: Z tego co doczytałem Sobie konstruktor klasy pochodnej zawsze wywołuje konstruktor klasy bazowej, więc zostaje moje pytanie czy da się jakkolwiek to ominąć, żeby nie wywoływał się ten konstruktor klasy bazowej.

7

Nie dziedzicz jeśli nie chcesz dziedziczenia. Ogółem Twoim problemem jest to, że wykorzystujesz konstruktor do interakcji z użytkownikiem, a on powinien tylko przyjmować parametry. Przenieś interakcję z użytkownikiem do osobnej funkcji i poczytaj o SRP

0

Moja rada na początek - nie twórz własnych klas jak masz problem z takimi rzeczami.

Spróbuj najpierw podejść do tego samymi funkcjami.

2
ByleDoPrzodu napisał(a):

Edit: Z tego co doczytałem Sobie konstruktor klasy pochodnej zawsze wywołuje konstruktor klasy bazowej, więc zostaje moje pytanie czy da się jakkolwiek to ominąć, żeby nie wywoływał się ten konstruktor klasy bazowej.

Musisz cos zrozumieć. na chwilę ROBOCZO nie dyskutujmy, czy samo to dziedziczenia ma sens (o tym później)

twój Kierownik JEST Pracownikiem, z 99% słuszności można roboczo powiedzieć, że klasa Pracownik <zawiera się> w Kierowniku. Skoro Kierownik JEST Pracownikiem, co więcej, jest nim "bardziej" a na pewno wcześniej niz kierownikiem, dlaczegóż konstruktory miały by się wywoływać inaczej ? Wywołują się jak najbardziej sensownie zgodnie ze standardem - i ze zdrowym rozsądkiem.

kq napisał(a):

problemem jest to, że wykorzystujesz konstruktor do interakcji z użytkownikiem, a on powinien tylko przyjmować parametry

Jak najbardziej popieram.

Teraz @ByleDoPrzodu o samym dziedziczeniu. Wszystkie kiepskie kursy C++ przeceniają rolę dziedziczenia, jakby to była jedyna i najważniejsza technika w OOP, a nie jest.

Był/jest sobie Jan Kowalski, nie jest kierownikiem. Pewnego pięknego dnia nim został. I co, mając już obiekt jan_kowalski zrobisz new Kierownik() ? Będziesz miał dwóch, naruszasz tożsamość obiektu.
Prawie zawsze w takich sytuacjach, to nie dziedziczenie jest właściwym modelem, ale kompozycja. Pracownik może posiadać od dnia X funkcję / rolę kierownika, może ją dostać, albo ją dnia Y tracić (dostając awans na wyższego przełożonego np Dyretora (co, zrobisz trzeci new ?), lub kopa)
Ale tego w słabych kursach ani "filmikach" nie znajdziesz.

Co więcej, jak się zwolni z roboty (wiele firm ma sezonowości), to nadal żyje, nadal; ma ten sam pesel, tą sama twarz, i pewnie za pół roku znów się zarekrutuje ... to na marginesie.

0

Sam fakt że myślisz o klasach jak o rzeczach już jest sygnałem że idziesz w złą stronę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1