© Harry Broeders.
Deze opdracht bestaat uit de deelopdrachten 3a t/m 3c. Alle deelopdrachten moet je laten aftekenen door de docent.
In een bedrijf werken verschillende soorten werknemers:
Binnen de salarisadministratie van het bedrijf heeft elke werknemer een registratienummer.
De analist die de specificaties voor het salarisadministratie programma heeft opgesteld heeft bedacht dat er rekening mee moet worden gehouden dat er in de toekomst andere soorten werknemers moeten worden toegevoegd. Bijvoorbeeld stukwerkers die werken voor een vast stukprijs. Het programma moet dus zoveel mogelijk onafhankelijk van het concrete werknemer type gemaakt worden.
Hieronder volgt een voorbeeld van een functie die onafhankelijk van het werknemer type is:
void printMaandSalaris(const Werknemer& w) {cout << "Werknemer: " << w.geefNummer()<< " verdient: " << setw(8) << setprecision(2) << fixed<< w.geefSalaris() << " Euro." << endl;}
Deze functie wordt vanuit de functie main als volgt aangeroepen (werk1.cpp
):
int main() {Freelancer f(1, 25.75); // werknemer 1 verdient 25.75 per uurVasteKracht v(2, 1873.53); // werknemer 2 verdient 1873.53 per maandf.werkUren(84); // werknemer 1 werkt (deze maand) 84 urencout << "Maand 1:" << endl;printMaandSalaris(f);printMaandSalaris(v);f.werkUren(13.5); // werknemer 1 werkt (deze maand) 13.5 urencout << "Maand 2:" << endl;printMaandSalaris(f);printMaandSalaris(v);cin.get();return 0;}
Denk er aan hoe
een
blaft! Bestudeer indien nodig
hoofdstuk 4 uit het dictaat. De relatie tussen de verschillende classes is
hiernaast gegeven.
Hoe je vanuit de constructor van een afgeleide class de constructor van de base class kunt aanroepen kun je vinden in paragraaf 4.5 van het dictaat.
-
Opdracht 3a.Implementeer de drie benodigde classes:
De juiste uitvoer is:
|
Merk op dat de functie printMaandSalaris niet "weet" welk soort
Werknemer gebruikt wordt. Dit betekent dat deze polymorphic
functie voor alle huidige "soorten" werknemers te gebruiken is. De functie is
zelf ook voor toekomstige "soorten" werknemers bruikbaar. Dit maakt het
programma eenvoudig uitbreidbaar. Op dit moment is het nodig om het programma
uit te breiden met een nieuw "soort" werknemer. Deze stukwerker werkt voor een
vast stukprijs.
De main functie wordt nu als volgt uitgebreid (werk2.cpp
):
int main() {Freelancer f(1, 25.75); // werknemer 1 verdient 25.75 per uurVasteKracht v(2, 1873.53); // werknemer 2 verdient 1873.53 per maandStukwerker s(3, 1.05); // werknemer 3 verdient 1.05 per stukf.werkUren(84); // werknemer 1 werkt (deze maand) 84 urens.produceerStuks(1687); // werknemer 3 produceert (deze maand) 1687 stukscout << "Maand 1:" << endl;printMaandSalaris(f);printMaandSalaris(v);printMaandSalaris(s);f.werkUren(13.5); // werknemer 1 werkt (deze maand) 13.5 urens.produceerStuks(0); // werknemer 3 produceert (deze maand) 0 stukscout << "Maand 2:" << endl;printMaandSalaris(f);printMaandSalaris(v);printMaandSalaris(s);cin.get();return 0;}
Er is nog een "soort" werknemer waarmee we het programma kunnen uitbreiden. Een manager is een werknemer die andere werknemers leiding geeft. De meeste managers hebben zelf ook weer een manager boven zich. Het bedrijf dat we als voorbeeld nemen heeft een originele manier bedacht om het salaris van een manager te bepalen. Het salaris van de manager is 2 maal zo hoog als het gemiddelde salaris van de mensen waaraan deze manager direct leiding geeft.
Het programma
moet natuurlijk ook het salaris van managers kunnen berekenen. De relatie
tussen manager en werknemer is als volgt:
De relatie tussen de classes Werknemer,
VasteKracht en Manager is hiernaast gegeven.
Het hoofdprogramma wordt nu (werk3.cpp
):
int main() {Stukwerker s(1, 1.05); // werknemer 1 verdient 1.05 per stukFreelancer f(2, 25.75); // werknemer 2 verdient 25.75 per uurVasteKracht v1(3, 1873.53);// werknemer 3 verdient 1873.53 per maandManager m1(4); // werknemer 4 is de manager van:m1.geeftLeidingAan(s); // - werknemer 1m1.geeftLeidingAan(f); // - werknemer 2m1.geeftLeidingAan(v1); // - werknemer 3VasteKracht v2(5, 2036.18);// werknemer 5 verdient 2036,18 per maandManager m2(6); // werknemer 6 is de manager van:m2.geeftLeidingAan(v2); // - werknemer 5m2.geeftLeidingAan(m1); // - werknemer 4s.produceerStuks(678); // werknemer 1 produceert 678 stuksf.werkUren(84); // werknemer 2 werkt 84 urenprintMaandSalaris(s);printMaandSalaris(f);printMaandSalaris(v1);printMaandSalaris(m1);printMaandSalaris(v2);printMaandSalaris(m2);cin.get();return 0;}