zugriff auf Objekte in vector <struct&>



  • Hallo!

    ich habe ein Problem mit dem Zugriff auf Objekte in einem Vector-Object.

    Im Vector sollen zeiger auf Objekte des Typs object gespeichert sein.

    nur als Beispiel:

    struct object {
    
    int x
    
    //getter + setter
    };
    
    vector <object&> objects;
    
    //...Füllen des objects-Vectors
    

    Wie greiffe ich dann auf die Attribute eines Objects zu?

    so objects[i].x oder villeicht so objects&[i].x ??

    Danke für euere Hilfe 🙂



  • vector <object&> objects;

    Würde entweder Pointer oder Objekte reintun.

    Ansonsten:

    vector <object> objects;
    int i = objects[0].x;
    


  • free_style schrieb:

    vector <object&> objects;

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



  • 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