sortowanie wektora wlasnych obiektów

0

Witam, muszę zrealizować sortowanie wektora własnych obiektów, według wytycznych:

-sortowanie alfabetyczne po nazwisku
-sortowanie po dacie urodzenia
-obydwa z powyższych sortowao z uwzględnieniem różnych kategorii

Mam klasę bazową Pracownicy:

 class Pracownicy{
protected:
	string imie;
	string nazwisko;
	int rok_urodzenia;
public:
	virtual void wypisz();
	Pracownicy();
	Pracownicy(string i, string n, int r_u);
	virtual ~Pracownicy();

};

oraz wektor:

 vector<Pracownicy*> Lista

Jeśli chcę posortować ten wektor to nie mogę zrobić funkcji:

 sort( Lista.begin(), Lista.end() );

muszę mieć funkcję moje_sort dla każdego z typów sortowań.
pytanie polega na tym jak w klasie w której mam zadeklarowany

 vector<Pracownicy*> Lista

jak stworzyć funkcję moje_sort aby sortowała według parametru imie?

1

Do funkcji std::sort możesz podać trzeci argument, warunek sortowania, który definiujesz sam.
więcej tu//www.cplusplus.com/reference/algorithm/sort/
np.

bool sort_name(std::string first,std::string second)
{
return first < second;
}

co do daty, to nie wiem jak ją przechowujesz.

1

Do funkcji sort możesz dac własny komparator jako trzeci argument.

2

Zakładając, że ta funkcja ma dostęp do zmiennej imie klasy Pracownicy (swoją drogą ta klasa powinna się nazywać Pracownik):

bool moje_sort(Pracownicy* lewy, Pracownicy* prawy)
{
	return lewy->imie < prawy->imie;
}
0

W tym miejscu czyli w klasie zarządca nie ma dostępu to Pracownik->imie.
Czy mogę zdeklarować tą funkcję(moje_sort) w klasie Pracownik a następnie odwołać się do niej operatorem :: jako 3 argument funkcji sort?

Edit1:
Ok mogę tak zrobić ;)
Dziękuję za podpowiedzi!

0

Poprawniej to zrobić jako funkcje statyczną.

0

Dwa pierwsze sortowania zrobiłem tak:

 static bool po_nazwisku(Pracownik* A, Pracownik* B);

to w klasie Pracownik, a w klasie Zarządca:

 void Zarzadca::sort_alfabetyczne(){
	sort( Lista.begin(), Lista.end(), Pracownik::po_nazwisku);
}

Teraz pytanie jak zrobić te 3 sortowanie.
Ma to wykonywać tak że jeśli wybiorę sortowanie Pracowników z klasy pochodnej "Programista" ma posortować tylko ich i wypisać, jak to mogę zrealizować, czy mogę wykorzystać funkcję z klasy bazowej którą napisałem? Jakie będzie najlepsze rozwiązanie?

1
bool dbl_cmp(Pracownicy* lewy, Pracownicy* prawy) { return lewy->kategoria!=prawy->kategoria?lewy->kategoria<prawy->kategoria:lewy->imie< prawy->imie; }
0

Dziękuję bardzo.

0

Narodziło się kolejne pytanie jak zapisać wektor obiektów do pliku tekstowego?

Plik.write(( char * ) & Lista[0], Lista.size() * sizeof( Pracownik ) ); 
0

Zapisuj rekord po rekordzie
Zdefiniuj sobie operator<<
I użyj to: http://www.cplusplus.com/reference/iterator/ostream_iterator/

To co podałeś nie ma prawa działać ponieważ masz użyte obiekty typu string

0

Wykonałem zapis do pliku w taki sposób:
Klasa bazowa:

 //*****PROGRAMISTA *****//
ostream& Programista::wypisz(ostream& out)const{
	return out << Pracownik::wypisz(out) <<"Staz pracy: " <<staz_pracy <<endl <<"Technologie oprogramowania: "<<technologie_oprogramowania<<endl;
}
ostream& operator<<(ostream& out , const Programista& programista){
	programista.wypisz(out);
	return out;
}

Klasy pochodne:

 ostream& Kierownik_projektu::wypisz(ostream& out)const{
	return out << Pracownik::wypisz(out) <<"Lata doświadczenia: " <<lat_doswiadczenia <<endl <<"Odbyte szkolenia: "<<odbyte_szkolenia<<endl;
}
ostream& operator<<(ostream& out , const Kierownik_projektu& kierownik){
	kierownik.wypisz(out);
	return out;
}

Zapis do pliku:

 for (int i=0 ; i<Lista.size() ;i++){
			Plik <<endl << "Pracownik nr." << i+1 <<": "<<endl;
			Plik << *Lista[i];

Mam mały problem ponieważ dane wpisuje wszystkie tak jak powinien, lecz przed danymi z klas pochodnych wrzuca jakiś adres wygląda to tak:

Pracownik nr.1:
Stanowisko: Programista
Imie: Jan
Nazwisko: Kowalski
Rok urodzenia: 1980
0018F83CLata doswiadczenia: 10
Odbyte szkolenia: Pascal

Czyli wszystko ok ale przed latami doświadczenia jest problem. Funkcja wypisz jest funkcją wirtualną. Co jest przyczyną tego stanu rzeczy?

1

Jeżeli zrobisz tą wypisz wirtualną to wystarczy że zrobisz to:

ostream& operator<<(ostream& out , const Pracownik &p) { return p.wypisz(out); }

pozostałe pochodne klasy Pracownik już nie potrzebują przeciążenia tego operatora.

Natomiast przeciążenie jest niepoprawne, w tym kodzie:

ostream& Kierownik_projektu::wypisz(ostream& out)const{
    return out << Pracownik::wypisz(out) <<"Lata doświadczenia: " <<lat_doswiadczenia <<endl <<"Odbyte szkolenia: "<<odbyte_szkolenia<<endl;
}

odpala się Pracownik::wypisz(out) która zwraca tego out'a po czym wrzucasz out<<out<<"Lata doświadczenia: "
Zamień na:

ostream& Kierownik_projektu::wypisz(ostream& out)const{
    Pracownik::wypisz(out);
    return out <<"Lata doświadczenia: " <<lat_doswiadczenia <<endl <<"Odbyte szkolenia: "<<odbyte_szkolenia<<endl;
}

lub na:

ostream& Kierownik_projektu::wypisz(ostream& out)const{
    return Pracownik::wypisz(out)<<"Lata doświadczenia: " <<lat_doswiadczenia <<endl <<"Odbyte szkolenia: "<<odbyte_szkolenia<<endl;
}
0

Dziękuję, mam nadzieję że za niedługo choć w połowie będę mieć takiego skila jak ty ;)

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