Erzeugtes class element in liste einfügen
-
okay, jetzt will ich nur noch, dass ich eine bestimmtes Flugzeug ausgeben will.
Ich hab eine Funktion gebaut:void flugzeug::getFlight(int id) { list<flugzeug>::iterator it; it = id; cout<<...die id ist quasi gleich der position in der liste.
Wie kann ich jetzt das Flugzeug mit seinen eigenschaften ausgeben lassen?
-
Das sollte aber keine Memberfunktion von flugzeug sein..

Du kannst den Iterator mittels
std::advanceum einen bestimmten Betrag verschieben, oder die, in solchen Fällen üblichere Variante nehmen und mittelsstd::findden Eintrag suchen.
-
So richtig steige ich noch nicht dahinter.Hab mir die find funktion angeschaut, ich weiß jetzt aber garnich so genau wie ich das mit dem suchen mache?
Ich will ja das Flugzeug an der Position in der liste suchen.
Kann ich auch nach Kriterien wie sprit suchen? und Wie?So wie ich es jetzt hab läuft es nicht.
void getFlight(int id) { list<flugzeug>::iterator it; it = find(data.begin(), data.end(), id ); cout<< *it <<endl; }außerdem bekomm ich folgende fehlermeldung:
(benutze eclipse mit mingw)Description Resource Path Location Type
")) << (&it)->std::_List_iterator<_Tp>::operator* [with _Tp = flugzeug]()' flug_erstellen.cpp Airport/src line 69 C/C++ Problemdanke!
-
Also wenn die ID wirklich der Position in der Liste entspricht, dann kannst du da getrost
std::advancebenutzen. Allerdings wäre dann eine liste ungeeignet und einstd::vectorwürde sich da eher eignen.Wenn du aber trotzdem eine liste hast, eignet sich zum suchen
std::find_if:class find_id { int id_; public: find_id ( int id ) : id_ ( id ) {} bool operator () ( const flugzeug & v ) { return v.get_id () == id_; } }; void getFlight(int id) { list<flugzeug>::iterator it; it = find_if(data.begin(), data.end(), find_id ( id )); cout<< *it <<endl; }
-
drakon, ich check das immer noch nicht ganz...

wieso erstell ich für die funktion find_if eine klasse? Kann ich zur ausgabe nicht schon mit meiner klasse flugzeug realisieren?
class flugzeug{ private: int id,sprit,anzeit; public: int landezeit; bool umleiten,abgestuerzt; flugzeug::flugzeug(int idc, int spritc, int anzeitc) : id(idc), sprit(spritc),anzeit(anzeitc) {} };und dieser operator (), muss der nicht ein namen haben? oder soll das der Operator für mein * vom cout<<*it sein?
bool operator () ( const flugzeug & v ) { return v.get_id () == id_; }und diese v.get_id ist doch das, worin dann mein cout gemacht wird??
Aber ist eine bool Fkt. nicht eine Funktion mit nur true / false als rückgabe wert?
Oder ist
-
find_ifist ein sogenannter Funktor, ein Funktionsobjekt und das ist gekennzeichnet durch die Implementierung desoperator (), was dem Funktionsaufruf entspricht einfach mit einer Klasse, anstatt einer Funktion.Der getter sollte nur genau das machen, wofür er gedacht ist und das ist alleine dir Rückgabe des Wertes und nicht noch automatisch etwas ausgeben.
Der Rückgabewert ist der Vergleich des Wertes im Objekt mit dem gesuchten Wert. Sobald der Wert gefunden wurde wird true zurückgegeben und du bekommst deinen iterator drauf.
-
@drakon: Du meinst wohl find_id, denn find_if ist die funktion, nicht der funktor.
-
theta schrieb:
@drakon: Du meinst wohl find_id, denn find_if ist die funktion, nicht der funktor.
Jop, habe mich verschrieben.
-
heißt das jetzt, dass der operator () sagt, was er machen soll mit dem wert in den klammern ja? Also weiß er, dass der wert in den klammer zur klasse flugzeug gehört und v ist einfach die variable in die der wert gesetzt wird?
const flugzeug & vJetzt musst ich ja in meine klasse flugzeug noch die funktion get_id schreiben.
int get_id() { return id; }aber da bringt er mir den fehler:
passing `const flugzeug' as `this' argument of `int flugzeug::get_id()' discards qualifiers
-
aaach!
das was ich gesucht habe war....it->get_id()
sry...danke nochmal
-
flugzeugcrasher schrieb:
....
Jetzt musst ich ja in meine klasse flugzeug noch die funktion get_id schreiben.int get_id() { return id; }aber da bringt er mir den fehler:
passing `const flugzeug' as `this' argument of `int flugzeug::get_id()' discards qualifiers
Weil Du sie zwar geschrieben ... aber nicht richtig geschrieben hast:
int get_id() const { return id; }
Gruß,
Simon2.
P.S.: Es bietet sich IMMER an, bei der Funktionsdeklaration gleich einen kurzen Gedanken daran zu verschwenden, welche Objekte wirklich durch diese Funktion geändert werden sollen (möglichst minimal) ... und die Anderen mit const zu kennzeichnen.
-
ja, hab ich jetzt auch gecheckt

Nochmal eine Frage, ich habe mir auch gleich einen Funktor für die Formatierte Zeitausgabe gebaut.
Der funktor befindet sich jetzt in der header datei, dort ist ja aber dieser iostream nicht eingebunden. Sprich ich kann nich einfach so cout in dem funktor ausführen.
Wie lös ich das am kleversten? kann man überhaupt #include im header ausführen? Oder muss ich es kompliziert zurückgeben?
mfg
-
und was ist der unterschied, ob ich die find_id funktion so schreibe:
class find_id{ public: bool operator () (int id_, const flugzeug & v ) const { return v.get_id () == id_;oder so:
class find_id{ private: int id_; public: find_id ( int idx ) : id_ ( idx ) {} bool operator () ( const flugzeug & v ) const { return v.get_id () == id_;