Foreward Declaration Anwendung



  • Wann genau ist eine Foreward Declaration notwendig und wann
    möglich? Stimmt das unten so?

    1. Hier wohl nicht notwendig aber möglich,
    es sei denn, KlasseB hat KlasseA inkludiert.
    (kann den letzten Punkt jemand besser erklären?)

    #include "KlasseB.h"
    
    class KlasseA
    {
    methode KlasseB nutzen
    };
    

    2. Hier wohl möglich, da nur der
    Pointer benutzt wird und include nicht notwendig.

    class KlasseB;
    
    class KlasseA
    {
    KlasseB* klasseB;
    };
    

    3. Definitionen bzw. Deklarationen stehen
    im Code nach der Erstnennung.

    Hat es grundsätzlich Vorteile, auf den include zu verzichten und
    stattdessen eine Foreward Declaration zu machen?

    Danke.



  • Darauf solltest du bestens verzichten. Manchmal irgendwo nicht möglich, wegen zyklischen Includes. Deswegen erst gebrauchen, wenns nicht mehr anders geht.



  • TauCeti schrieb:

    Hat es grundsätzlich Vorteile, auf den include zu verzichten und
    stattdessen eine Foreward Declaration zu machen?

    Ja, Compile-time und zwar enorm. Daher halte ich das

    Darauf solltest du bestens verzichten.

    für quatsch.



  • Quatsch der Typ ist ein Anfänger.

    Wir leben übrigens in einem Zeitalter wo man parallel kompilieren kann.



  • Trotzdem sollten es Anfänger auch gleich von Anfang an richtig lernen und umsetzen.
    Also Vorwärtsdeklarationen bevorzugen (z.B. bei Zeiger oder Referenzen), und nur wenn der komplette Typ benötigt wird, das Einbinden der Headerdatei mittels #include.



  • Egalwat. Wenn man nicht sowas wie die Qt-Libs baut sollte man Forward declarations gänzlich vermeiden. Das führt nur dazu, dass es übermäßig und unbedacht benutzt wird oder um einen Designfehler zu vertuschen. Was es mit Pimpl auf sich hat und wie man das verwendet, dafür muss man jetzt nicht intensiv rumpimpeln.



  • wörtner schrieb:

    oder um einen Designfehler zu vertuschen.

    Jetzt bin ich aber mal auf ein Beispiel gespannt.



  • Th69 schrieb:

    und nur wenn der komplette Typ benötigt wird, das Einbinden der Headerdatei mittels #include.

    Was ist mit kompletter Typ gemeint?



  • Das Gegenteil von Incomplete Type 😉

    Also z.B. bei

    // include "B.h"
    class B;
    
    class A
    {
      B b;
      // or
      void do_something(B b) { this.b = b; }
      // or
      B getB() const { return this.b; }
    };
    

    Ohne das Einbinden von "B.h" (wo dann die komplette Klassendeklaration drin stehen muß) gibt es sonst einen Compiler-Fehler, da die Größe (sizeof) nicht bekannt ist, s.a. Ideone-Code.


  • Mod

    TauCeti schrieb:

    Th69 schrieb:

    und nur wenn der komplette Typ benötigt wird, das Einbinden der Headerdatei mittels #include.

    Was ist mit kompletter Typ gemeint?

    Standardsprech für eine nicht-Forward-Deklaration.


Log in to reply