C++ Was in den Header, was nicht?

In den Header gehört normalerweise nur das, was von außen sichtbar sein muss/soll - also nur Deklarationen, keine Implementationen.
 
Inline-Methoden sollten meines Wissens nach noch in die Header-Datei. Also Definition und Deklaration.
Hierbei kannst du die Definition mit in die Klassendeklaration schreiben oder zwecks Übersichtlichkeit auch darunter (dann Klassenname::Methodenname).
 
Tockra schrieb:
Hey Leute,

Ich stelle mir gerade die Anfängerfrage, was genau nun wirklich in den Header einer Klasse gehört und was nicht.
Trenne ich wirklich zwischen deklaration und definition, oder ist es manchmal z.B. sinnvoll den Konstruktor schon im Header zu implementieren?

Gruß
T

So wenig wie möglich in den Header packen. Definitionen nach Möglichkeit in die .cpp. Bei templates und inline-Funktionen hast du, wie schon erwähnt, keine Wahl ... da muß der Compiler stehts die komplette Definition kennen, was bedeutet, dass diese Dinge in den Header müssen.

Auch an #includes nur das allernötigste in den Header. Möglichst - soweit der Compiler beim Erwähnen eines Typnamens die volle Definition nicht kennen muß - im Header mit Vorwärtsdeklarationen arbeiten und die entsprechenden #includes erst in der .cpp einziehen.
 
Das ist eine reine Designfrage. c++ selbst ist es ziemlich egal was im Header steht und was nicht. Möglicherweise gibt es da Einschränkungen, aber die sind mir nicht bekannt.

Gutes Design ist es, in den Header ausschließlich von außen aufrufbare Methoden zu definieren. Alles, was im Header steht soll außen sichtbar sein und umgekehrt soll alles außen sichtbare in den Header. Alles, was du nicht von außen sehen kannst, landet in der Klassendatei.

Übrigens gerne falsch verstanden: Auch private primitive Variablen sollten nicht in den Header. Das erschwert die Programmierung unnötig. Wie gesagt, ist aber alles nur ein sollte, müsste, könnte - die letztliche Entscheidungshoheit liegt beim Programmierer.
 
SoDaTierchen schrieb:
Übrigens gerne falsch verstanden: Auch private primitive Variablen sollten nicht in den Header. Das erschwert die Programmierung unnötig. Wie gesagt, ist aber alles nur ein sollte, müsste, könnte - die letztliche Entscheidungshoheit liegt beim Programmierer.

Wie willst du vermeiden, die in den Header zu packen? Außer, du hast vor, mit dem pimpl-Idiom die Implementierung einer Klasse zu verstecken ... aber das lohnt meiner Meinung nach nur in wenigen Fällen ... meistens ist es die zusätzliche Indirektionsebene (immerhin ein Zeiger) nicht wert.
 
Generell hält man den Code so lokal wie möglich. Es ist immer ein Sicherheitsrisiko unnötiges Zeug (global) in einen Header zu packen.
 
Miuwa schrieb:
Was hat das mit Sicherheit zu tun?

Eigentlich erst mal nix. Ich könnte mir maximal vorstellen, daß man durch das unnötige inkludieren von Headern (von denen ja viele ihrerseits wieder weitere Header inkludieren) sich eventuell den Namensraum mit jeder Menge Präprozessorsymbolen verschmutzt, die unter Umständen das Verhalten des Programms auf subtile, aber unerwünschte Weise verändern können (wenn man Glück hat, gibt's bloß einen Syntaxfehler oder Linkerfehler).
 
Was ich um jeden Preis vermeiden würde, sind plattformspezifische C-Header anderen Header-Dateien - eben weil mal sich damit den Hauptnamensraum mit Dingen zumüllt, von denen man eigentlich nichts wissen will.

Hierbei kannst du die Definition mit in die Klassendeklaration schreiben oder zwecks Übersichtlichkeit auch darunter (dann Klassenname::Methodenname).
Wobei explizite Inline-Funktionen eigentlich nie so lang sein sollten, dass sie die Übersichtlichkeit merklich beeinträchtigen.

Bei Templates sieht die Sache natürlich anders aus, auch wenn ich persönlich auch da kein großer Freund der Trennung bin. Was ich aber auch schon in irgendeinem Projekt gesehen habe:
- Template-Deklaration in einer .hpp-Datei
- Definition in einer .tpp-Datei
- der .hpp-Header #includet am Ende die .tpp-Datei.
 
Zurück
Oben