Konstruktoraufruf



  • Hallo,

    ich stehe vor etwa folgendem Problem bei dem ich nicht mehr weiter weiß:

    [cpp]
    class A
    {
      private:
        int var;
      public:
        A {};
        void setVarA (int value) { var=value; }
    }
    
    A::A
    {
      var = B::getCount(); ??????
    }
    
    class B
    {
      private:
        int count;
        A a;
      public:
        B { count = 0; }
        int getCount () { return ++count; }
    }
    
    int main ()
    {
      B b1;
    }
    [/cpp]
    

    Beim Aufruf des Konstruktors der class A (was bei der Definition des Objektes b geschieht) soll dem Objekt a eine von der Klasse B verwaltete Zahl zugewiesen werden. Mir ist allerdings unklar, wie der Konstruktor von A die Funktion getCount der Klasse B aufrufen kann.
    Leider kann ich den Code nicht auf Inheritance abändern, wo dies mit upcasten ginge.

    Hättet ihr vielleicht einen Vorschlag wie ich den Funktionsaufruf um Konstruktor A gestalten muss?



  • Klarer Designfehler.



  • A::A(const B& b) // <- Funktionsklammern nicht vergessen, auch bei 0 Parametern
    : var(b.getCount()) // <- Initialisierungsliste
    {
       // <- Funktionsrumpf ist leer
    }
    

    Dafür muss B zu dem Zeitpunkt vollständig bekannt sein. Lagere die Klassendefinitionen (mit Deklarationen der Methoden) in eigene Headerdateien aus benutze dort Vorwärtsdeklarationen der jeweils anderen Klasse. In den Implementierungsdateien (.cpp) inkludierst du die Header und definierst alle Methoden.

    Mache Funktionen wie B::getCount() konstant, wenn sie nichts am Objekt ändern.

    int getCount() const;
    


  • Janjan schrieb:

    Klarer Designfehler.

    Schön, dass du immer so konstruktive und hilfreiche Beiträge schreibst.



  • Nexus schrieb:

    Janjan schrieb:

    Klarer Designfehler.

    Schön, dass du immer so konstruktive und hilfreiche Beiträge schreibst.

    Danke.



  • Die Lösung von Nexus ist im Grunde korrekt.
    Besser ist aus meiner Sicht aber den von der Basisklasse benötigten Wert direkt zu übergeben, wie folgt:

    A::A(int count) // <- Funktionsklammern nicht vergessen, auch bei 0 Parametern
    : var(count) // <- Initialisierungsliste
    {
       // <- Funktionsrumpf ist leer
    }
    

    Bei Nexus' Lösung legt man sich auf ein abgeleitete Klasse bestimmten Typs fest.



  • einint schrieb:

    Bei Nexus' Lösung legt man sich auf ein abgeleitete Klasse bestimmten Typs fest.

    Das stimmt natürlich, aber ich wollte nicht zu viel spekulieren, was das Design angeht. Kann beispielsweise sein, dass A von B auf irgendeine Art abhängt und möglicherweise noch mehr als nur der int im Konstruktor wichtig ist.

    Ansonsten ist es tatsächlich sinnvoller, sich eine unnötige Abhängigkeit zu sparen.



  • Vielen Danke für Eure Hilfe!


Anmelden zum Antworten