Organisation von includes



  • Hallo Forum,
    mal eine Frage an Leute, die bereits große C++ Projekte realisiert haben. Wie bindet Ihr Eure includes ein. Einfaches Beispiel:
    Wenn ich objektorientiert mit Vererbung programmiere, werden ja die includes der Basisklasse auch an die abgeleiteten Klassen vererbt. Includes der Basisklassen sind also überflüssig. Doch auch wenn ich nur in Basisklassen includes einbinde, finde ich das unübersichtlich, dass includes über das gesamte Modul verteilt sind.

    Wie macht Ihr das? Funktioniert es, wenn man im globalen Geltungsbereich (in main.h) alle benötigten Includes einbindet?

    Würde mich über Tips freuen.
    Danke
    Martin


  • Mod

    Includes kommen genau dort hin, wo sie gebraucht werden. Anders geht das wohl auch kaum. Und bloß keine globale Includedatei mit allen benötigten Includes, da wäre ja der ganze Sinn der Modularität hinfällig.

    Ansonsten verstehe ich nicht genau was du meinst, dein Beitrag ist ein bisschen...wirr.



  • Ehrlich gesagt verstehe ich kein Stück, was Du meinst.
    Includes werden gar nicht vererbt. Includes sorgen für simple Textersetzung. Da, wo Du etwas einbindest, steht der komplette Text der eingebundenen Datei, und zwar an genau der Stelle, wo die Datei eigebunden wird.

    Beispiel:

    //a.h
    
    class A
    {
       int a;
       int b;
    };
    
    //b.h
    
    #include "a.h"
    
    class B
    {
    };
    

    Daraus wird durch den Präprozessor:

    class A
    {
       int a;
       int b;
    };
    
    class B
    {
    };
    

    Vererbung ist da erstmal nicht im Spiel und hat auch mit Includes nichts zu tun.

    Damit Du aber von einer Klasse erben kannst, muss diese vollständig bekannt sein. Eine Vorwärtsdeklaration reicht nicht.



  • Das hat nichts mit Übersichtlichkeit zu tun. Du inkludierst so wenig, wie möglich, aber so viel, wie nötig.
    Abhängigkeiten kannst du verhindern, indem du dir Gedanken machst ob überall Definitionen von Klassen gebraucht werden oder ob Deklarationen reichen. Siehe dazu z.B hier.

    Das heisst konkret:
    Mach mal alle includes weg.
    Dort, wo du lediglich den Namen einer Klasse brauchst machst du eine Vorwärtsdeklaration der Klasse.
    Dort, wo du die Definition brauchst bindest du den entsprechenden Header ein.
    Das sind die optimalen includes, wie sie sein sollten.

    Es kann zwar sein, dass so die gleiche Headerdatei mehrmals auf einem Pfad inkludiert wird, aber dafür hast du Headerguards.


Anmelden zum Antworten