Welche Art von Methoden sollten alle ins Headerfile zur Klasse?
-
Servus,
als Java-Freund ist mir das mit den Header-Files ja etwas fremd. Sollen ins Header-File der Klasse eher nur die public-Methoden rein oder auch die private-Methoden?
Nach welchen Kriterien entscheidet ihr bei rein prozeduralem Code, ob ihr Funktionsprototypen schreibt oder wann ihr direkt Funktions-Kopf und -Rumpf an Ort Stelle reinschreibt. Ab wann verwendet ihr inline-Funktionen?
Variante 1:
func1(){ ... }
func2(){ ... }
main(){ ... }Variante 2:
func1();
func2();
main(){ ... }
func1(){ ... }
func2(){ ... }Danke vorab.
-
Jay1980 schrieb:
Sollen ins Header-File der Klasse eher nur die public-Methoden rein oder auch die private-Methoden?
Auch die
private-Memberfunktionen. Du musst ja alle Member in der Klassendefinition deklarieren. Aber wenn du Funktionen hast, die keinen direkten Zugriff aufprivate-Member ades Objekts benötigen, kannst du sie auch als freie Funktionen erst in der .cpp-Datei definieren.Jay1980 schrieb:
Nach welchen Kriterien entscheidet ihr bei rein prozeduralem Code, ob ihr Funktionsprototypen schreibt oder wann ihr direkt Funktions-Kopf und -Rumpf an Ort Stelle reinschreibt. Ab wann verwendet ihr inline-Funktionen?
Header oder nicht hat eigentlich nichts mit prozedural zu tun. Ich persönlich schreibe die Definition eigentlich immer in eine separate .cpp-Datei (ausser vielleicht bei kleinen Templates und Klassen, die ohnehin erst in der .cpp definiert werden). Der Code bleibt so übersichtlicher, man kann ihn ohne Rekompilierung aller Benutzer ändern, und mit Linkzeit-Codegenerierung ist er auch nicht langsamer.
Bei lokalen Funktionen in einer .cpp-Datei habe ich oft einen anonymen Namensraum mit den Definitionen am Anfang. Aber ich überlege mir, diesen an den Schluss zu verlagern, weil es halt schon schöner ist, wenn man am Anfang gleich die wirkliche Implementierung sieht. Dafür hat man Codeduplizierung...
-
Jay1980 schrieb:
Nach welchen Kriterien entscheidet ihr bei rein prozeduralem Code, ob ihr Funktionsprototypen schreibt oder wann ihr direkt Funktions-Kopf und -Rumpf an Ort Stelle reinschreibt. Ab wann verwendet ihr inline-Funktionen?
Funktionsprototypen verwende ich dann, wenn die Funktion über mehrere CPP-Dateien hinweg benutzt wird.
Inline-Funktionen verwende ich bloß, wenn sie sehr kurz sind und oft verwendet werden.
-
Jay1980 schrieb:
Servus,
als Java-Freund ist mir das mit den Header-Files ja etwas fremd. Sollen ins Header-File der Klasse eher nur die public-Methoden rein oder auch die private-Methoden?
In C++ gibt es zwar keine Unterscheidung zwischen class und interface wie in Java, aber man kann und sollte in den Schnittstellen abstrakte Klassen verwenden, so wie man es in Java mit Interfaces tut (oder tun sollte). Dann relativiert sich das Problem mit den private-Funktionen auch etwas.
Implementiert man jedoch z.B. eine Klasse complex, so ist sinnvoll die Funktionen aus Performancegründen inline im Header zu haben.
-
In C++ auch sehr ueblich ist es, das PIMPL-Idiom zu verwenden, um damit Abhaengigkeiten und laengere Kompilezeiten zu umgehen. Wenn du das tust, kannst du dir private-methoden im Header (der eigentlichen Klasse) auch sparen: http://en.wikipedia.org/wiki/Opaque_pointer
-
manni66 schrieb:
Implementiert man jedoch z.B. eine Klasse complex, so ist sinnvoll die Funktionen aus Performancegründen inline im Header zu haben.
Nein. Das
inline-Schlüsselwort (und implizite Inline-Methodendefinitionen) haben primär einen Einfluss auf die Linkage und sollten auch entsprechend verwendet werden. Ob ein Funktionsaufruf tatsächlich inline-expandiert wird, kann der Compiler in den meisten Fällen besser entscheiden.Blue-Tiger schrieb:
In C++ auch sehr ueblich ist es, das PIMPL-Idiom zu verwenden, um damit Abhaengigkeiten und laengere Kompilezeiten zu umgehen.
Wobei "sehr üblich" vielleicht übertrieben ist. Grundsätzlich sind ja
private-Member nicht etwas Schlimmes. Aber wenn man durch das Handle-Body-Idiom grosse Abhängigkeiten auslagern kann, lohnt sich ein Blick darauf. Nur sollte man bedenken, dass das auch nicht gratis ist (zusätzliche dynamische Allokation und indirekter Zugriff über Zeiger, ausserdem muss aufgrund fehlender sinnvoller Smart-Pointer-Implementierungen manuell Speicher verwaltet und konsistent gehalten werden).
-
Nexus schrieb:
manni66 schrieb:
Implementiert man jedoch z.B. eine Klasse complex, so ist sinnvoll die Funktionen aus Performancegründen inline im Header zu haben.
Nein. Das
inline-Schlüsselwort (und implizite Inline-Methodendefinitionen) haben primär einen Einfluss auf die Linkage und sollten auch entsprechend verwendet werden. Ob ein Funktionsaufruf tatsächlich inline-expandiert wird, kann der Compiler in den meisten Fällen besser entscheiden.Ich verstehe nicht, was du meinst.
struct A { inline void a() {} void b(); }; inline void A::b() { }Bei Funktion a verhält sich der Compiler unabhängig vom Schlüsselwort inline immer gleich, Funktion b wäre ohne das Schlüsselwort mehrfach definiert, wenn der Header mehrfach benutzt wird.
-
Eben. Du benutzt
inlinezur Regelung der Linkage (keine Mehrfachdefinitionen) und nicht der Performance.
-
Nein, ich schreibe die Funktionen aus Performancegründen in den Header, damit Compiler sie ohne "echten" Funktionsaufruf direkt auflösen (eben inlinen) kann. Bei hinreichend vielen Funktionsaufrufen spart das Zeit. Das Schlüsselwort inline ist dabei manchmal notwendig, manchmal nicht.
Entscheiden bei meiner Aussage war, die Funktion in den Header zu schreiben. Ich meinte nicht, das Schlüsselwort inline möglichst häufig zu gebrauchen.
-

Hier was fundiertes zum Thema:
http://www.gotw.ca/gotw/033.htm