Wieso brauch ich hier ein Include?



  • Angenommen ich habe folgenden Aufbau:

    // Header_a.h
    
    class A {
    public:
        int i;
        std::string text;
        char c;
    }
    
    // Header_b.h
    
    #include "Header_a.h"
    
    class B {
    public:
        int i;
        std::string text;
        A a;
    }
    

    Wieso muss ich in Header_b.h den Header für die Klasse A einbinden, aber nicht den für die Klasse std::string?



  • DienstagsKalmar schrieb:

    Wieso muss ich in Header_b.h den Header für die Klasse A einbinden, aber nicht den für die Klasse std::string?

    <string> solltest du natürlich auch inkludieren!
    Und B braucht A weil in B eine Instanz vom Inhalt von A gemacht wird. Logisch!

    MfG, EOutOfResources



  • Wenn du keine weiteren includes hast, dann sollte das so nicht gehen. Es kann aber sein, dass wenn du einen anderen Header inkludierst, dass da ev. string bereits inkludierd wird.

    Wann und wo includes nötig sind und wann Vorwärtsdeklarationen reichen kannst du hier nachlesen.



  • Nein, bei std::string muss ich <string> nur in der cpp-Datei einbinden. Header_a.h muss ich bei Header und cpp einbinden.
    Oder ist das nur eine Funktion von Visual Studio, dass man die STL in Headern nicht mehr einbinden muss?


  • Mod

    Logischwerweise hat Header_a.h doch schon ein (zumindest indirektes) Include von String, sonst könnte A keinen string-Member haben. Daher braucht es in Header_b.h keine explizite Einbindung mehr von string.

    In dieser Hinsicht, haben sich folgende Stilregeln etabliert:
    - Niemals darauf verlassen, dass sich fremde Header (z.B. die der Standardbibliothek) auf eine bestimmte Weise gegenseitig einbinden. Das geht immer schief.
    - Es ist hingegen vollkommen ok, wenn man in einer Sourcecodedatei die Includes aus dem direkt dazu gehörigen Header weg lässt.
    - Der Fall wo man selber mehrere Header schreibt die sich gegenseitig einbinden ist so ein Grenzfall. Man sollte auf jeden Fall nicht zu indirekt werden. Und jeder Header muss immer für sich alleine genommen funktionieren, ebenso darf nie etwas von der Includereihenfolge abhängig sein. Im Zweifelsfall lieber einmal zuviel Include.



  • DienstagsKalmar schrieb:

    Nein, bei std::string muss ich <string> nur in der cpp-Datei einbinden. Header_a.h muss ich bei Header und cpp einbinden.
    Oder ist das nur eine Funktion von Visual Studio, dass man die STL in Headern nicht mehr einbinden muss?

    Das kommt ganz auf die Reihenfolge an, in der die #include's stehen - schließlich steckt hinter dem Präprozessor nur simple Textersetzung. Wenn du <string> vor dem "header_a.h" stehen hast, kannst du die Definitionen von std::string dort sehen, wenn du es andersherum machst, hagelt es Compilerfehler.
    Aber wie SeppJ schon sagte, solltest du dich nicht darauf verlassen, daß die Reihenfolge immer "korrekt" eingehalten wird.


Anmelden zum Antworten