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
-
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