Klasse enthält std::vector vom Typ seiner selbst



  • Ich dachte bislang das incomplete types, also auch Kompositionen in einer Klasse von der Klasse slbst nur mittels Pointern oder Referenzen gestattet sind.

    Aber scheinbar funktioniert

    class A{
    A(){
    objects_.push_back(A{""});
    }
    A(std::string){}
    
    std::vector<A> objects_
    };
    

    Kan mir jemand erklären weshalb?



  • Wo siehst Du den Widerspruch?

    VG


  • Mod

    Ich sehe das keine A-Objekte in der Klasse A, sondern nur ein Objekt, welches möglicherweise einen Verweis auf A-Objekte enthalten könnte oder nicht.



  • Ok also die Regel betrifft nur reine Objekte, vielen Dank



  • @Sewing
    Wenn T ein Typ mit einem Member M ist...
    Dann darf die Definition des Typs M (*) nicht erfordern dass T ein vollständiger Type ist.

    D.h...
    M darf nicht T sein
    M darf keine T Member haben
    M darf keine Member haben die von z.B. sizeof(T) abhängig sind
    M darf keine Member haben die von sonstigen Eigenschaften von T abhängig sind (die erst bei vollständigen Typen bekannt sind)

    vector<T> geht, da vector<T> im Prinzip bloss nen T* als Member braucht, und dafür muss T nicht vollständig definiert sein. optional<T> geht nicht, da optional<T> von sizeof(T) abhängig ist. Genau so geht z.B. boost::container::small_vector<T> nicht, ebenfalls wegen sizeof(T).

    *: Das schliesst die Signaturen der Memberfunktionen von M ein, nicht aber die Definition der Memberfunktionen von M.



  • danke hustbaer, jetzt hab ichs verstanden.

    Tolles Forum hier 🙂


Log in to reply