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.


Anmelden zum Antworten