Standardkonstruktor wird vermisst
-
Hi, ich hab mir ein Programm zum lernen angeguckt, aber irgendwie funzt es nicht, weil er den Standardkonstruktor vermisst... was muss ich an dem Programm ändern?
#include<iostream> #include<string> using namespace std; class UltimateBase { private: int value; public: UltimateBase(int value) : value(value) {} int print() const { return value; } }; class Base1 : virtual public UltimateBase { public: Base1(int value) : UltimateBase(value) {} }; class Base2 : virtual public UltimateBase { public: Base2(int value) : UltimateBase(value) {} }; class Derived : public Base1, public Base2 { public: Derived(int a, int b) : Base1(a), Base2(b) {} }; int main() { Derived d(3,4); cout<<d.print()<<'\n'; cin.get(); return 0; }
-
class UltimateBase { private: int value; public: //Der hat gefehlt: UltimateBase() : value(0) {} UltimateBase(int value) : value(value) {} int print() const { return value; } };MfG
GPC
-
Alternativ kannst du dem vorhandenen Konstruktor auch einen Default-Parameter spendieren:
class UltimateBase { private: int value; public: UltimateBase(int v=0) : value(v) {} ... }(Der Default-Ctor wird nur erzeugt, wenn die Klasse gar keinen eigenen Ctor mitbringt)
-
Ja, dann gibs keine Fehler mehr, aber denn wird 0 anstatt von 3 ausgegeben
wieso?
-
Weil wir value per default auf 0 gesetzt haben, ich explizit und CStoll implizit über den Default-Parameter. Bitte zeig ein bisschen Eigeninitiative.
EDIT:
Diese Rautenform ist eh ungünstig, ist das nicht das Anti-Mehrfachvererbungs-Beispiel von Shade?MfG
GPC
-
Und eine virtuelle Basisklasse wird direkt von ganz unten in der Hierarchie initialisiert - d.h. wenn der Default-Ctor nicht das richtige macht, mußt du im Konstruktor der untersten abgeleiteten Klasse (Derived) angeben, welcher Konstruktor mit welchen Parametern aufgerufen werden soll.