wohin mit den #include Anweisungen?
-
Hallo,
kann man pauschal sagen, ob die #include Anweisungen zum einbinden anderer Header in die .cpp oder in die .h gehören?
Dachte bisher immer, includiert wird in der .cpp, habe aber gerade etwas Ärger damit:
jede .cpp und .h Datei kapselt eine einfache Klasse!
in A.cpp includiere ich B.h.
in B.cpp wird wiederum C.h includiert.da ich nun jedoch im header von B bereits Klasse C in Deklarationen verwende, jedoch im Header von B die Klasse C natürlich nicht includiere, scheitert das Kompilieren von A.cpp, obwohl sich B.cpp selbst compilieren lässt.
sollte ich includes lieber in die Header schreiben? wenn ja, alle? oder nur einen Teil?
bin etwas verwirrt!Habt dank,
Wurfholz
-
Ich halte es immer so: Die Includes, die die Header-Datei wirklich braucht, schreibe ich auch rein. Wenn ich eine Klassendefinition in A.h habe, sollte A.cpp mit dem alleinigen Include von A.h kompilieren
(edit: Ohne weiteren Quelltext, nur dieses Include; für die Implementation der Funktionen braucht man u.U. ja noch weitere Header)
-
Wenn Du in der B.h nur Referenzen/Pointer auf C Objekte hast, dann reicht eine Vorwärtsdeklaration:
class C; // Vorwärtsdeklaration class B { public: B(C& ref); void do_something(const C* p); private: C& theCObject; };Ansonsten musst Du in B.h die C.h inkludieren
-
Das kommt immer auf die Situation drauf an. In deinem Fall würde ich diese in den Header schreiben, ja.
-
Kurzfassung: Bind die Header dort ein, wo sie gebraucht werden. Wenn die Definition der Klasse A (in der "A.h") auf der Klasse B aufbaut, gehört das #include in den Header (gelegentlich reicht eine Forward-Deklaration aus), wenn B nur intern von A verwendet wird, gehört's in die A.cpp.
(oder anders: Inkludiere so, daß für einen Anwender (Hauptprogramm o.ä.) ein '#include "a.h"' ausreicht, um deine Klasse verwenden zu können)
-
Das Includieren von Header-Dateien sollte soweit möglich in den Cpp-Dateien erfolgen.
Es kommt allerdings nicht selten vor das eine Header-Datei von anderen abhängig ist. In dem Fall ist es besser diese im Header einzubinden.
-
Vielen Dank
Ich kannte die forwärts Deklarationen noch aus C, habe aber vergessen, dass ich auch Klassen forwärts Deklarieren kann.
Jetzt läufts!
-
Ein Musterbeispiel, wie man aus einem Include-Horror eine saubere Aufteilung der Header udn Source-Dateien bekommt findet sich unter http://www.gotw.ca/gotw/007.htm . Doch recht lohnenswert in meinen Augen...