Erzeugtes class element in liste einfügen



  • 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