Erzeugtes class element in liste einfügen



  • Benutz doch die cpp - Tags, ansonsten kann man das kaum lesen..

    flugzeug::flugzeug(int idc, int spritc, int anzeitc)
    {
    id = idc;
    sprit = spirtc;
    anzeit = anzeitc;
    }
    ~Flugzeug();
    

    Mach das lieber so:

    flugzeug::flugzeug(int idc, int spritc, int anzeitc)
    : id ( idc ), //Initialisierungsliste
    sprit ( spritc ),
    anzeit ( anzeitc )
    {}
    

    Ansonsten werden die Werte initialisiert und danach noch zugewiesen. Macht da keinen grossen Unterschied, aber spätestens, wenn du const Werte hast, wirst du auf die Initialisierungsliste angewiesen sein.
    Den dtor kannst du auch weglassen, oder leer lassen, da du nichts aufräumen musst.



  • 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::advance um einen bestimmten Betrag verschieben, oder die, in solchen Fällen üblichere Variante nehmen und mittels std::find den 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++ Problem

    danke!



  • Also wenn die ID wirklich der Position in der Liste entspricht, dann kannst du da getrost std::advance benutzen. Allerdings wäre dann eine liste ungeeignet und ein std::vector wü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_if ist ein sogenannter Funktor, ein Funktionsobjekt und das ist gekennzeichnet durch die Implementierung des operator () , 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 & v
    

    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



  • 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_;
    

Anmelden zum Antworten