Header in Header angeben oder doch lieber in CPP-Datei?



  • Hallo,
    mich beschäftigt die Frage ob es sinnvoller ist Header in anderen Header-Dateien anzugeben oder doch lieber in CPP-Dateien.

    Beispiel:

    // main.cpp
    #include "klasse.h"
    
    int main()
    {
        Klasse K1;
        K1.Ausgabe("Hallo");
    }
    
    // klasse.h
    class Klasse
    {
    public:
        void Ausgabe(const char* Text)
    };
    
    // klasse.cpp
    #include "klasse.h"
    
    void Klasse::Ausgabe(const char* Text)
    {
        std::cout << Text << std::endl;
    }
    

    Wo wäre es jetzt am sinnvollsten <iostream> zu includieren? Wenn ich es in der klasse.cpp includiere, habe ich es direkt dort wo es gebraucht wird. Wenn ich allerdings nachträglich eine Funktion inline direkt in der Klasse deklarieren will, muss ich <iostream> nachträglich dort einfügen und vergesse eventuell den nicht mehr gebrauchten include zu entfernen.
    Gibt es da irgendeine "Regel" für sauberes programmieren oder ist es völlig egal? Dann würde ich es nämlich lieber in der klasse.h includieren.



  • Grundregel: Immer, wenn man es braucht, aber so spät wie möglich.

    Also bei dir ist das erste Beispiel schlecht, da jeder Benutzer immer dran denken müsste deine includes (die er ja gar nicht kennt) auch noch mit reinnehmen.

    Was allerdings ein wenig Spielraum hätte wäre der include in der klasse.h oder klasse.cpp. Wenn du also z.B std::string benutzt und zuerst nur in der .cpp includest ist das Ok. Wenn du aber dann plötzlich ein std::string speichern willst musst du den include in den Header verschieben (Vorwärtsdeklaration reicht nicht mehr). Da könnte es vorkommen, dass du ein include in der .cpp zu viel hast. Das ist aber kein Problem, wenn du Headerguards benutzt und passiert sowieso (da ein Header vlt. auch std::string benutzt und daher den include auch schon hat).



  • Binde Header so spät wie möglich ein, d.h. bevorzugt in .cpp-Dateien, oder wenn du sie nicht brauchst, nie.

    In deinem Fall ist #include <iostream> innerhalb klasse.cpp am klügsten. Du willst nicht plötzlich eine Inline-Methode schreiben, nur um Header-Abhängigkeiten zu erhöhen.


Anmelden zum Antworten