Mój program dotyczący pracowników i zarobków, który wcześniej konsultowałem na forum jest na ukończeniu, jednak mam problem z posortowaniem kontenera wg "wynagrodzenia". Rozumiem zamysł użytkownika ison z tego forum, jednak u mnie sprawa się komplikuje, gdyż działam na klasie abstrakcyjnej Pracownik, z której dziedziczą trzy pozostałe klasy, zaś sam dostęp do składowych tych klas jest prywatny, a pole "wynagrodzenie" znajduje się dopiero w trzech klasach potomnych.
Czy mógłbym prosić o wytłumaczenie w jaki sposób ugryźć rozwiązanie tego problemu w moim przypadku? Byłbym również wdzięczny za inne uwagi dotyczące mojego kodu, bo może wyrobiłem sobie jakieś niepotrzebne nawyki lub podchodzę do czegoś niepoprawnie...
Kod zamieszczam poniżej oraz podświetlam istotne linijki:
//===============================================
// Nazwa : pracownik.h
//===============================================
#ifndef PRACOWNIK_H
#define PRACOWNIK_H
#include <iostream>
#include <cstdio>
#include <string>
#define PROCENT 0.35
#define PREMIA 1.5
#define STRUMIEN 128
using namespace std;
class Pracownik
{
private:
bool zatrudnienie;
string imie;
string nazwisko;
string nip;
string pesel;
public:
Pracownik();
Pracownik(string im, string nzwsk, string psl, string np);
bool sprawdzDane(string im, string nzwsk);
bool porownajZarobki(Pracownik& p1,Pracownik& p2);
virtual void wyswietlDane() = 0;
virtual void obliczZarobki() = 0;
virtual ~Pracownik() {};
};
class Staly: public Pracownik
{
private:
double wynagrodzenie;
public:
Staly();
Staly(string im, string nzwsk, string psl, string np, double wngrdzn);
void obliczZarobki() {} // istotne
void wyswietlDane();
~Staly() {};
};
class Zleceniobiorca: public Pracownik
{
private:
double stawka;
int godziny;
double wynagrodzenie;
public:
Zleceniobiorca();
Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn);
void wyswietlDane();
void obliczZarobki();
~Zleceniobiorca() {}
};
class Handlujacy: public Pracownik
{
private:
double wartosc;
int transakcje;
double wynagrodzenie;
public:
Handlujacy();
Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj);
void wyswietlDane();
void obliczZarobki();
~Handlujacy() {}
};
void enter();
void naglowek();
void czyszczenie();
#endif
//===============================================
// Nazwa : pracownik.cpp
//===============================================
#include "pracownik.h"
Pracownik::Pracownik()
{
zatrudnienie = true;
cout << "Wprowadzanie danych nowego pracownika..." << endl;
cout << "Imie: ";
cin >> imie;
cout << "Nazwisko: ";
cin >> nazwisko;
cout << "PESEL: ";
cin >> pesel;
cout << "NIP: ";
cin >> nip;
}
Pracownik::Pracownik(string im, string nzwsk, string psl, string np)
{
zatrudnienie = true;
imie = im;
nazwisko = nzwsk;
pesel = psl;
nip = np;
}
Staly::Staly(): Pracownik()
{
cout << "Miesieczne wynagrodzenie: ";
cin >> wynagrodzenie;
}
Staly::Staly(string im, string nzwsk, string psl, string np, double wngrdzn): Pracownik(im, nzwsk, psl, np)
{
wynagrodzenie = wngrdzn;
}
Zleceniobiorca::Zleceniobiorca(): Pracownik()
{
cout << "Godzinna stawka: ";
cin >> stawka;
cout << "Przepracowane godziny: ";
cin >> godziny;
obliczZarobki();
}
Zleceniobiorca::Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn): Pracownik(im, nzwsk, psl, np)
{
stawka = stwk;
godziny = gdzn;
obliczZarobki();
}
Handlujacy::Handlujacy(): Pracownik()
{
cout << "Wartosc pojedynczej transakcji: ";
cin >> wartosc;
cout << "Ilosc transakcji: ";
cin >> transakcje;
obliczZarobki();
}
Handlujacy::Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj): Pracownik(im, nzwsk, psl, np)
{
wartosc = wrtsc;
transakcje = trnskcj;
obliczZarobki();
}
void Zleceniobiorca::obliczZarobki()
{
if(godziny>40)
wynagrodzenie = stawka * PREMIA;
else
wynagrodzenie = stawka;
}
void Handlujacy::obliczZarobki()
{
wynagrodzenie = wartosc * transakcje * PROCENT;
}
void Pracownik::wyswietlDane()
{
cout.width(15);
cout << left << imie;
cout.width(15);
cout << left << nazwisko;
cout.width(15);
cout << left << pesel;
cout.width(15);
cout << left << nip;
}
void Staly::wyswietlDane()
{
Pracownik::wyswietlDane();
cout.width(15);
cout.setf( ios::showpoint );
cout << left << wynagrodzenie << endl;
}
void Zleceniobiorca::wyswietlDane()
{
Pracownik::wyswietlDane();
cout.width(15);
cout.setf( ios::showpoint );
cout << left << wynagrodzenie << endl;
}
void Handlujacy::wyswietlDane()
{
Pracownik::wyswietlDane();
cout.width(15);
cout.setf( ios::showpoint );
cout << left << wynagrodzenie << endl;
}
bool Pracownik::sprawdzDane(string im, string nzwsk)
{
if(imie == im && nazwisko == nzwsk)
return true;
return false;
}
bool Pracownik::porownajZarobki(Pracownik& p1, Pracownik& p2)
{
return p1.wynagrodzenie > p2.wynagrodzenie;
}
void enter()
{
getchar();
getchar();
}
void naglowek()
{
cout.width(5);
cout << left << "Lp:";
cout.width(15);
cout << left << "Imie:";
cout.width(15);
cout << left << "Nazwisko:";
cout.width(15);
cout << left << "PESEL:";
cout.width(15);
cout << left << "NIP:";
cout.width(15);
cout << left << "Wynagrodzenie:" << endl;
}
void czyszczenie()
{
printf("\033[2J"); // Czysci ekran
printf("\033[0;0f"); // Ustawia kursor w lewym, gornym rogu
}
//==================================================
// Nazwa : main.cpp
//==================================================
#include <vector>
#include <windows.h>
#include <algorithm>
#include "pracownik.h"
int main()
{
vector <Pracownik*> kadra;
kadra.push_back(new Staly("Piotr","Wierchowienski","63032300373","4457301037",3300));
kadra.push_back(new Staly("Mikolaj","Stawrogin","89102905493","7260631988",4100));
kadra.push_back(new Zleceniobiorca("Iwan","Szatow","77082213114","6825506522",2300,50));
kadra.push_back(new Zleceniobiorca("Aleksy","Kirillow","85052403018","5913117469",2700,35));
kadra.push_back(new Handlujacy("Sergiusz","Liputin","67052801713","4621950579",800,14));
kadra.push_back(new Handlujacy("Ignacy","Lebiadkin","79091902931","8442924521",850,10));
unsigned short wybor;
do
{
cout << "Zarzadzanie kadra pracownicza:" << endl;
cout << "[1] --> Zatrudnij stalego pracownika" << endl;
cout << "[2] --> Zatrudnij zleceniobiorce" << endl;
cout << "[3] --> Zatrudnij handlujacego" << endl;
cout << "[4] --> Wyswietl dane pracownika" << endl;
cout << "[5] --> Wyswietl dane calej kadry" << endl;
cout << "[6] --> Wyswietl liczbe pracownikow" << endl;
cout << "[7] --> Zwolnij pracownika" << endl;
cout << "[8] --> Zwolnij cala kadre" << endl;
cout << "[0] --> Wyjscie" << endl;
cout << "Twoj wybor: " << endl;
do
{
cin.clear();
cin.sync();
cin >> wybor;
}
while(!cin.good());
cout << endl;
switch(wybor)
{
case 1 :
kadra.push_back(new Staly());
break;
case 2 :
kadra.push_back(new Zleceniobiorca());
break;
case 3 :
kadra.push_back(new Handlujacy());
break;
case 4 :
{
if(kadra.empty())
{
cout << "Brak zatrudnionych pracownikow. [ENTER]" << endl;
enter();
break;
}
cout << "Wyszukiwanie pracownika na podstawie imienia i nazwiska..." << endl;
string szukaneImie,szukaneNazwisko;
cout << "Imie: ";
cin >> szukaneImie;
cout << "Nazwisko: ";
cin >> szukaneNazwisko;
unsigned int i;
for(i=0; i<kadra.size(); i++)
{
if(kadra[i]->sprawdzDane(szukaneImie,szukaneNazwisko))
{
kadra[i]->wyswietlDane();
cout << "Aby powrocic do menu nacisnij [ENTER]." << endl;
enter();
break;
}
}
if(i==kadra.size())
{
cout << "Brak pracownika o takim imieniu u nazwisku. [ENTER]";
enter();
break;
}
}
break;
case 5 :
{
if(kadra.empty())
{
cout << "Brak zatrudnionych pracownikow. [ENTER]" << endl;
enter();
break;
}
unsigned int i;
sort(kadra.begin(),kadra.end(),porownanie);
naglowek();
for(i=0; i<kadra.size(); i++)
{
cout.width(5);
cout << left << i;
kadra[i]->wyswietlDane();
}
cout << "Aby powrocic do menu nacisnij [ENTER]." << endl;
enter();
}
break;
case 6 :
cout << "Liczba pracownikow: " << kadra.size() << ". [ENTER]" << endl;
enter();
break;
case 7 :
{
if(kadra.empty())
{
cout << "Brak zatrudnionych pracownikow. [ENTER]" << endl;
enter();
break;
}
cout << "Usuwanie pracownika o podanym indeksie" << endl;
unsigned int szukanyIndeks;
do
{
cout << "Indeks:";
cin.clear();
cin.sync();
cin >> szukanyIndeks;
}
while(szukanyIndeks>kadra.size() || !cin.good());
kadra.erase(kadra.begin()+szukanyIndeks);
cout << "Usunieto pracownika. Aby powrocic do menu nacisnij [ENTER]." << endl;
enter();
}
break;
case 8 :
kadra.clear();
cout << "Cala kadra zostala zwolniona. [ENTER]" << endl;
enter();
break;
}
system("cls");
}
while(wybor!=0);
return 0;
}