zugriff auf Objekte in vector <struct&>



  • Mhh habt Ihr dann evtl. ne andere Lösung...

    es geht darum zuerst Objecte vom Typ struct object zu generieren, also

    object o1, o2, o3;

    und diese dann in einer Liste zu speichern um sie durch eine For-Schleife abfragbar zu machen, sodass nicht jedes Objekt immer einzeln angesprochen werden muss.



  • asc schrieb:

    free_style schrieb:

    vector <object&> objects;

    Du kannst keine Referenzen auf Objekte in einen Vektor speichern. Entweder Objekte oder Zeiger, aber keine Referenzen.

    Und wie speichere ich Zeiger auf Objekte in einem Vector?



  • vector<objekte*> dein_objekt;
    


  • Ich steht grad irgendwie auf'm Schlauch...

    also ich erstelle mir Objekte z.B. von einem Typ Tier:

    struct tier(
    
    int gewicht;
    int beine;
    
    // Konstruktor, getter, setter
    );
    
    tier hase, huhn, pferd;
    

    die speichere ich dann in einem vector:

    vector <tier> viecher;
    
    vector[0] = hase;
    vector[1] = huhn;
    vector[2] = pferd;
    

    wenn ich jetzt auf ein objekt in viecher zugreife, greife ich dann auf das Originalobjekt zu?

    gilt also: hase.gewicht = vector[0].gewicht ?

    Danke für euere tips...



  • free_style schrieb:

    Mhh habt Ihr dann evtl. ne andere Lösung...

    es geht darum zuerst Objecte vom Typ struct object zu generieren, also

    object o1, o2, o3;

    und diese dann in einer Liste zu speichern um sie durch eine For-Schleife abfragbar zu machen, sodass nicht jedes Objekt immer einzeln angesprochen werden muss.

    Wenn du mit Objektkopien einverstanden bist, verwende Objekte im Vector (std::vector<object>). Ansonsten musst du halt mit Zeigern arbeiten (std::vector<object*>).

    Wobei ich mich frage warum du die Objekte dann nicht gleich im push_back erzeugst. Ohne gleich auf weitere vector-Möglichkeiten einzugehen:

    //...
    
    int main()
    {
        std::vector<object> objectList;
        for(int i=0; i<10; ++i)
        {
            objectList.push_back(object()); // Hinzufügen eines neuen "object"
            objectList[i].x = i;
        }
    
        int xSumme = 0;
        for(int i=0; i<10; ++i)
            xSumme += objectList[i].x;
    }
    


  • Du greifst auf eine Kopie deiner Objekte zu.
    Dein Code würde so wie er da steht aber auch nicht funktionieren, da dein Vektor noch die Länge 0 hätte. Entweder du gibst ihm schon im Konstruktor eine Länge mit, oder du fügst deine Objekte mit push_back ein. Dann würde die Länge automatisch angepasst.

    vector <tier> viecher;
    // jetzt werden deine Objekte in den Vektor kopiert.
    vector.push_back(hase);
    vector.push_back(huhn);
    vector.push_back(pferd);
    


  • free_style schrieb:

    wenn ich jetzt auf ein objekt in viecher zugreife, greife ich dann auf das Originalobjekt zu?

    Nein, std::vector arbeitet wie jeder Standardkontainer mit Kopien (Daher auch die Anforderung das Objekte kopierbar sein müssen).



  • asc schrieb:

    Nein, std::vector arbeitet wie jeder Standardkontainer mit Kopien (Daher auch die Anforderung das Objekte kopierbar sein müssen).

    Etwas genauer: Wegen der Kopien in den Containern müssen die Objekte copy-konstruierbar sein. Bei vector und deque müssen sie zusätzlich noch copy-assignable sein, da diese intern die Objekte "herumkopieren" können.



  • SUPER !!!

    Vielen Danke euch allen - funktioniert alles!!



  • Nur so am Rande:

    free_style schrieb:

    struct tier(
    
    int gewicht;
    int beine;
    
    // Konstruktor, getter, setter
    );
    

    Ich würde dir raten, die Member private zu machen, sonst verfehlen die Getter und Setter ihren Sinn. Oder du machst gleich ein C-Style-POD. Und Block-Klammern sind eigentlich geschweift.


Anmelden zum Antworten