<algorithm> sort, problem
-
hi,
ok soweit so gut aber irgendwie will es mit dieser memberfunktion auch nicht...
void car_add(char menue, Fahrzeuge *car, list<Fahrzeuge> *kfz) { car = new Fahrzeuge; //zuweisungen kfz->push_back(*car); //sort( kfz->begin(), kfz->end() ); kfz->sort(); delete car; }c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\list(957): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool std::_Debug_lt<Fahrzeuge,Fahrzeuge>(_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)". with [ _Ty1=Fahrzeuge, _Ty2=Fahrzeuge ] c:\programme\microsoft visual studio 8\vc\include\list(948): Bei der Kompilierung der Klassen-template der void std::list<_Ty>::merge(std::list<_Ty> &)-Memberfunktion with [ _Ty=Fahrzeuge ] i:\#proggen-fh\_studium fh-worms\_grundstudium\programmieren 2\praktikum\ss2006_aufgabe5\kfz-verwaltung\main.cpp(45): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::list<_Ty>". with [ _Ty=Fahrzeuge ] c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(276) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(151): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(141): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\string(131): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\list(1274): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\xutility(1842): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "Fahrzeuge" hergeleitet werden. c:\programme\microsoft visual studio 8\vc\include\utility(76): Siehe Deklaration von 'std::operator <' c:\programme\microsoft visual studio 8\vc\include\xutility(278) : error C2676: Binärer Operator '<': 'Fahrzeuge' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht KFZ-Verwaltung - 14 Fehler, 0 Warnung(en)
-
Deine Klasse Fahrzeug braucht einen operator<
BTW, warum allokierst und löscht Du sinnlos Speicher, nur um eine Kopie davon in die Liste zu packen?
kfz->push_back(car( ));
-
Du brauchst einen Vergleichsoperator (operator<) für Fahrzeuge, um sortieren zu können. Andernfalls weiß sort() nicht, in welcher Reihenfolge es die Elemente anordnen soll.
Übrigens macht es deine Parameterübergabe wenig Sinn. Entweder du legst dein 'car' in der Funktion an, dann brauchst du dafür keinen Pointer-Parameter (nimm lieber eine lokale Variable) oder du übergibst ein fertig initialisiertes Objekt:
//Variante 1: void add_car(list<Fahrzeuge>&kfz,const string& modell,int ps/*,...*/) { Fahrzeuge car; //car initialisieren kfz.push_back(car); ... } add_car(kfz_list,"VW Golf",100/*,...*/); //Variante 2: void add_car(list<Fahrzeuge>&kfz,const Fahrzeuge& car) { kfz.push_back(car); ... } Fahrzeuge auto; //auto initialisieren add_car(kfz_list,auto);
-
hmm
ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...
sry programmiere noch nicht lange c++ ( klassen etc.. ).werde später versuchen deine methode umzusetzen cstoll. danke schön!
-
Da_Pedro schrieb:
ich hab mir das so gedacht, ich leg ein objekt zu der klasse an, lese die werte ein, lege es in der liste ab und lösche das objekt wieder...
Gute Idee, nur ist es Overkill, dafür die Heap-Verwaltung anzuwerfen
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
-
CStoll schrieb:
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
*Hmmm* *grümel*
Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??
-
Freak_Coder schrieb:
CStoll schrieb:
Stack-Objekte (=lokale Variablen) sind um einiges schneller.
*Hmmm* *grümel*
Man kann Objekte doch auf dem Stack schneller anlegen und entfernen als aufm Heap, oder ? Das meint dein "schneller" auch .. ?Aber der Zugriff auf Objekte auf dem Stack/Heap ist doch gleich schnell ... ??
der zugriff ja, aber die reservierung des speichers (und die spätere freigabe) ist auf dem stack praktisch völlig ohne zeitkosten, beim freestore sieht das anders aus. in diesem einfachen fall würde ich auf eine lokale variable ganz verzichten und gleich nur ein temporäres objekt anlegen. also
kfz->push_back(Fahrzeuge());
-
du sagst ich brauche einen vergleichsoperator < aber wo ist der in deinem bsp? muss ich dafür eine const variable anlegen um diese vergleichen zu können?
ich poste mal wie meine funktion aussieht, sortiert werden soll nach nummernschild..:
void car_add(char menue, list<Fahrzeuge> *kfz) { string nrschild, hersteller, modell, km, kraftstoff; Fahrzeuge car; cout << "Bitte Fahrzeugdaten eingeben" << endl << endl; cout << "Nummernschild: "; getline(cin,nrschild); cout << "Hersteller: "; getline(cin,hersteller); cout << "Modell: "; getline(cin,modell); cout << "Kilometer: " ; getline(cin,km); cout << "Kraftstoff: "; getline(cin,kraftstoff); car.set_nrschild(nrschild); car.set_hersteller(hersteller); car.set_modell(modell); car.set_km(km); car.set_kraftstoff(kraftstoff); kfz->push_back(car); //sort( kfz->begin(), kfz->end() ); kfz->sort(); system("cls"); }meine klasse sieht so aus:
.hclass Fahrzeuge { public: Fahrzeuge(); ~Fahrzeuge(void); void set_nrschild(string); string get_nrschild(); //... protected: string nrschild,//...restliche var.cpp
void Fahrzeuge::set_nrschild(string dummy_nrschild) { nrschild = dummy_nrschild; } string Fahrzeuge::get_nrschild() { return nrschild; }
-
Deine Klasse Fahrzeuge braucht einen Vergleichsoperator, wie soll sie sonst sortiert werden.
Global sieht das etwa so ausbool operator<( const Fahrzeuge& lhs, const Fahrzeuge& rhs) { // nun der Code für den Vergleich }
-
aso ich muss den operator für meine bedürfnisse überladen... jetzt klingelts. vielen dank