vector mit Objekten füllen, die keinen Default Ctor haben?



  • Hallo!

    Ich habe eine Klasse Spline, und die braucht als Member einen Vector von HermiteCurve Objekten:

    class Spline {
       std::vector<HermiteCurve> member;
    
    }:
    

    Das Problem ist nun, dass Bar KEINEN Default Ctor hat und ich bekomme wohl deswegen einen Fehler:

    Error 2 error C2512: 'math::HermiteCurve::HermiteCurve' : no appropriate default constructor available

    Für HermiteCurve macht ein Ctor ohne Werte auch einfach keinen Sinn. Wie kann ich das Problem beseitigen?

    Danke!



  • würde statt vector list gehen?



  • Hi schiwet,

    ich schätze mal HermiteCurve erbt von Bar, oder?

    Das Problem ist, wenn ich das richtig sehe, dass du im Konstruktor nicht
    expizit einen Konstruktor der Basisklasse aufrufst, wodurch er versucht
    den (nicht-vorhandenen) Default-Konstruktor zu nehmen.

    Hast du sowas wie:

    HermiteCurve :: HermiteCurve() : Bar(0 /* oder welcher Parameter auch immer */){
    }
    

    Das Problem liegt (wie ich denke) nicht an dem geposteten Code...

    Gruß,
    CSpille



  • Elemente in Standardcontainern müssen nicht zwingend standardkonstruierbar sein.

    Wenn du den std::vector -Konstruktor mit einer Grösse und einem Anfangswert als Parametern aufrufst, werden die Objekte kopiert. Gleiches gilt für resize() . Bei insert und push_back musst du sowieso immer gleich einen Wert angeben.



  • Nein, HermiteCurve erbt von keiner Klasse.

    Jetzt blick ich garnicht mehr durch! Auf einmal funktioniert alles, obwohl ich nix geändert hab! Hä??

    Gehen wir das mal kurz durch: Mein Ctor von Spline ruft nicht explizit irgend einen Ctor von member auf, also müsste doch automatisch der Default Ctor von std::vector aufgerufen werden, wenn ich ein Objekt von Spline anlege, oder? Da ich das Programm jetzt (auf einmal) ohne Probleme starten kann, braucht ein T Typ offenbar KEINEN Default Ctor, wenn ich das mache:

    std::vector<T> member;
    

    Richtig? Da wird dann intern in vector einfach kein einziges Objekt von T angelegt, oder?

    Wenn ich hingegen das schreibe:

    std::vector<T> member(3);
    

    dann braucht T einen Default Ctor, oder?



  • schiwet schrieb:

    Da ich das Programm jetzt (auf einmal) ohne Probleme starten kann, braucht ein T Typ offenbar KEINEN Default Ctor, wenn ich das mache:

    std::vector<T> member;
    

    Richtig? Da wird dann intern in vector einfach kein einziges Objekt von T angelegt, oder?

    Richtig.

    schiwet schrieb:

    Wenn ich hingegen das schreibe:

    std::vector<T> member(3);
    

    dann braucht T einen Default Ctor, oder?

    Genau, schliesslich müssen die 3 Objekte irgendwie konstruiert werden. Falls sie keinen Standardkonstruktor besitzen, kannst du wie gesagt einen Wert festlegen, mit dem die Objekte initialisiert werden sollen:

    std::vector<T> member(3, T("hallo", 47));
    

Anmelden zum Antworten