Veerbung Fehler .NET



  • Hi,

    Ich bekomme folgenden Fehler:

    error C2512: 'derived2': Kein geeigneter Standardkonstruktor verfügbar
    error C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt
    Code wird generiert...

    Und zwar sieht die Struktur so aus:

    //////////////////////////////////////////
    //iBase:
    public:
            iBase(const unsigned int, const string);
            virtual ~iBase(){};
    [...]
    
    iBase(const unsigned int iID, const string sLabel)
    m_iID(iID), m_sLabel(sLabel)
    {}
    
    //////////////////////////////////////////
    //Derived1:
    public:
    	Derived1(unsigned int, string);
    	~Derived1(){};
    private:
    	Derived2 D2;
    [...]
    
    Derived1(unsigned int iID, string sLabel)
    : iBase(iID, sLabel)
    {
            D2(iID, sLabel);  // HIER FEHLER!
    }
    
    //////////////////////////////////////////
    //Derived2:
    public:
            Derived2(unsigned int, string);
            ~Derived2(){};
    [...]
    
    Derived2(unsigned int iID, string sLabel)
    : iBase(iID, sLabel)
    {}
    

    Tja, wahrscheinlich gehts, wenn ich in iBase einen ctor explizit angebe, aber das ist nicht das was ich will. Seltsamerweise lässt sich Derived1 wunderbar ableiten, nur Derived2 motzt bei Initialisierung.

    Sorry für den Pseudo-Code, aber ich komme nicht ans Original im Moment 👎

    Vielen Dank!



  • Okay okay.

    Also, das Problem tritt nur auf, wenn ich die Deklaration verwende um später zu initialisieren:

    DerivedX D;
    D(1, "bloep");

    Dann motzt er, das DerivedX keinen Standardkonstruktor hat. Aber ich will doch erst später initialisieren!

    Da holt mich doch der Geier, ich dachte hier liegt eine Trennung vor zwischen Deklaration (order Speicher) und Definition (initialisiere).

    DerivedX darf NATÜRLICH keinen Standardkonstruktor haben, weil die ID z.B einzigartig sein soll. Es macht also keinen Sinn, Standardmäßig auf 0 oder ä. zu setzen.

    KA, was mach ich denn jetzt?



  • D2(iID, sLabel);
    

    Das sollte in die Initialisierliste, dort wo du auch den Basisklassen-Konstruktor aufrufst.



  • Gut, das funktioniert.

    Allerdings ist das doch das Gleiche, als wenn ich in main bspw. zuerst nur die Deklaration schreibe, und dann später initialisiere. Ich verstehe nicht, wieso der den Standardkonstruktor aufrufen will.

    Ich kann doch auch schreiben:
    int i;
    i=5;

    Für Objekte muss es doch ein Äquivalent geben, wenn ich nur einen bestimmten Konstruktor will?



  • Nene. Erstens ist

    D2(...)
    

    schon mal überhaupt gar keine gültige Anweisung. Etwas gültiges wäre

    D2 = Derived2(...)
    

    Des weiteren wäre das eine Zuweisung, also das Erstellen eines Derived2 und das Zuweisen des Erstellten Objekts an D2. Allerdings wird D2 vorher schon initialisiert, wie jedes andere nicht-primitive Objekt im Konstruktor einer Klasse initialisiert wird. Und das geschieht, wenn nicht in der Initialisierliste anders angegeben, mit dem Standardkonstruktor. Die Zuweisung wäre also sowieso kein Ersatz für die Initialisierung.


Anmelden zum Antworten