Vorwärtsdeklarationen



  • Ich will bisschen darauf achten, sauber mit includes / Vorwärtsdeklarationen zu arbeiten. Dazu habe ich bisher folgendes festgelegt:

    - Soweit möglich (Ausnahme: Inline-Methoden) werden Klassennamen für eigene Klassen immer mit einer Vorwärtsdeklaration bekannt gemacht.

    - In der Implementierung der jeweiligen Klasse (*.cpp-Datei), werden die Klassen dann tatsächlich inkludiert.

    Sollte ein guter Leitfaden sein, oder?
    Wie wird das jetzt aber handgehabt, wenn man z.B. mit der WinAPI arbeitet? Da gibt es sehr viele typedefs, wenn ich jetzt eine Klasse in einem Header deklariere, kann ich den Typen nicht nutzen, ohne "windows.h" zu inkludieren. Soll ich hier eine Ausnahme machen, oder gibt es einen anderen weg?

    Wie verhält es sich mit der Standardbibliothek? Eine using-Direktive würde z.B. std::vector für alle Dateien sichtbar machen, die meinen Header inkludieren. Wie kann ich eine Vorwärtsdeklaration für eine Klasse in einem Namespace schreiben? Oder gibt es für die beiden Punkte andere Lösungsansätze?

    Danke im Voraus!



  • Vorwärtsdeklarationen auf Klassen in Namespaces gehen so:

    namespace _namespacename
    {
        class _classname;
    }
    

    🙂

    Ich stelle mir gerade eine weitere Frage:
    Soll ich alle Header, dich ich für meine Klasse brauche, im Klassenheader, oder ggf. erst im Cpp-File inkludieren? Also verteilen. Was im Klassenheader gebraucht wird, wird dort inkludiert, was ich im Cpp-File brauche, binde ich dort ein.



  • Du solltest, soweit es geht, die Abhängigkeiten immer möglichst gering halten, d.h. so wenig wie möglich in den Header-Files einbinden.

    Wenn du nur ein Projekt für dich selber machst, ist das ja kein Problem. Sobald du aber daraus eine DLL o.ä. erzeugst, so sollte das aufrufende Programm gerade nur die benötigten Klassen und typedefs etc. kennen (bei Templates ist das etwas anderes, diese müssen komplett in die Header).

    Du solltest "using" auch nicht global in deinen Headern verwenden, sondern wenn überhaupt, dann in den Namespaces:

    namespace XYZ
    {
      using std::vector;
    }
    

    Aber eigentlich ist es für Header-Dateien besser, wenn dort die externen Namespaces explizit ausgeschrieben werden.

    Ein großes Problem ist wirklich <windows.h>, da dies ein reiner C-Header ist (besonders die MAKROS sind der Horror!).
    Es ist eigentlich der ANTI-Prototyp eines guten Headers (da er der Ober-Header für zig andere Header darstellt - je nachdem welche MAKROS gesetzt sind).

    Versuch am besten deine Klassen so zu kapseln, daß du in den reinen Logikklassen keinerlei Verwendung für <windows.h> benötigst, sondern verwende stattdessen dort die Klassen und Typen der Standard C++ Bibliothek.


Log in to reply