Definition eines static vector als Klassenelement



  • Hallo,
    ich habe eine Klasse foo, die in etwa so deklariert ist:

    class foo
    {
    public:
    foo();
    //...
    private: 
    vector<Item> v_inv;
    };
    

    "Item" ist eine Struktur, die so ausschaut:

    struct Item
    {
    string a;
    int b;
    bool c;
    int d;
    };
    

    Da der vector v_inv als static deklariert ist, muß ich ihn ja definieren. Ich weiß allerdings nicht, wie die Definition auszusehen hat. Ich habe es so probiert:
    foo::v_inv[0]={"",0,0,0};
    aber das geht nat. nicht.
    Würde mich freuen, wenn ihr mir da weiterhelfen könntet.
    Grüße
    E-the-Real



  • foo::v_inv[0]={"",0,0,0};
    aber das geht nat. nicht.

    vielleicht ne funktion, die nen ensprechenden und gut gefüllten vector zurückgibt?

    foo::v_inv=initThisGlobalVector();
    


  • hmmm, ich weiß nicht, wie die aussehen könnte. Ich habe folgendes probiert:
    In der Klassendeklaration:

    class foo
    {
    //....
    private:
    vector<Item> InitVector(void);
    };
    

    ...und die Implementierung:

    vector<Item> Inventory::InitVector(void)
    {
    	vector<Item> v;
    	Item it={"",0,0,0};
    	v.push_back(it);
    	return v;
    }
    

    leading to:

    error C2552: 'it' : Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht moeglich

    Scheint mir auch etwas merkwürdig...
    Wie macht man das?
    Thx



  • Ok, dieser Fehler ist leicht behoben. Aber ich weíß immer noch nicht, wie ich den Vector definiere.
    Problem dazu: Vector soll am Anfang eigentlich kein Element enthalten, also leer sein.
    Erst im weiteren Verlauf wird er gefüllt.
    😕



  • warum schreibst du dir nicht einfach einen Konstruktor? Ist ja eh kein POD mehr, wenn du std::string verwendest



  • // hpp
    
    class foo  {
    
    private:
      static std::vector < Item > vec;
      /* ... */
    };
    
    // cpp
    std::vector < Item > foo::vec;
    

    was auch immer



  • hmmm, ja, das geht, aber ich weiß immer noch nicht, wie ich den vector initialisere/definiere/whatever... 🙄

    Wie muß das aussehen?
    So?

    Item i={"",0,0,0};
    foo::v_inv.pushback(i);
    

    oder so?

    foo::v_inv[0]={"",0,0,0};
    

    oder wie? Beide Methoden haben bei mir nicht funktioniert. Weiterhin ist daran schlecht, dass dan v_inf schon ein Element besitzt.
    Ich hoffe, ich konnte mich deutlich ausdrücken, wo mein Problem genau liegt...

    edit: @WasAuchImmer: Jepp, sowas habe ich in etwa gesucht. Hab gerade geschrieben, als du gepostet hast.



  • Nochmal eine kleine Verständnisfrage:

    In der Klasse

    class foo  {
    private:
      static std::vector < Item > vec;
     };
    

    wird ja vec nur deklariert.
    Die Definition

    std::vector < Item > foo::vec;
    

    , obwohl sie vec keinen Wert zuweist, belegt dann den entsprechenden Speicherplatz für vec, oder? Desw. geht also diese Definition ohne Zuweisung?
    Wenn das so ist, dann hab ich's kapiert. 😉
    Dankeschön @all!



  • ethereal schrieb:

    Nochmal eine kleine Verständnisfrage:

    In der Klasse

    class foo  {
    private:
      static std::vector < Item > vec;
     };
    

    wird ja vec nur deklariert.
    Die Definition

    std::vector < Item > foo::vec;
    

    , obwohl sie vec keinen Wert zuweist, belegt dann den entsprechenden Speicherplatz für vec, oder? Desw. geht also diese Definition ohne Zuweisung?
    Wenn das so ist, dann hab ich's kapiert. 😉
    Dankeschön @all!

    Hier wird einfach der Std-Konstruktor aufgerufen und somit Speicher reserviert.



  • Alright. Aber wieviel Byte werden denn reserviert, wenn vec anfangs noch kein Element enthält?



  • das hängt von der Implementierung ab. Aber mit std::vector<>::reserve kannst du da ja beeinflussen, was je nachdem auch für ordentlich Speedup sorgen kann.

    Wobei du zwischen einfach allokierten und belegten Speicher unterscheiden musst.


Anmelden zum Antworten