[C++] Frage zur Methodenimplementierung

Zalman

Cadet
Mitglied seit
29.07.2004
Beiträge
35
Renomée
0
Hallo,

ich bin momentan am C++-Lernen, zuvor habe ich etwas Java gelernt. Was mir aufgefallen ist in C++, ist, dass in meinem Buch generell die Klassen mit den Methoden in Header-Files deklariert werden und dann die Methoden in cpp-Files implementiert werden. Warum macht man das so? Besserer Stil?

Wie ich bemerkt habe, funktioniert alles auch wenn ich die Methode direkt in der Klasse implementiere wie in Java.

Außerdem klappt es auch, wenn ich die Methoden in der Klasse deklarie (in einer Headerfile) und dann auch in der Headerfile direkt die Implementierung unterhalb der Klasse schreibe.

Welche der 3 Vorgehensweißen ist besser?

Danke vorab.
 
Eine Implementierung muss hind und wieder geändert werden. Wenn nun in der *.cc/*.cpp implementiert ist, reicht es aus, nur diese neu zu übersetzen. Wenn im Headerfile geändert wird, müssen alle Softwarepakete, die diesen Header nutzen, neu übersetzt werden.

Aus genau dem Grund werden in einem c++ Headerfile auch nur die unbedingt nötigen Files includiert. Alles anderen includes kommen in die *.cc

D.h. im Buch ist es richtig beschrieben, natürlich können einfache Dreizeiler auch im Headerfile implementiert werden (z.B. Operatoren).

Deine 3. Variante funktioniert wahrscheinlich nicht, wenn das Headerfile mehrfach includiert wird, dann würde der Linker mehrere Implementierungen finden.
 
Der Sinn, nur die Methodendeklaration in's Headerfile zu schreiben, ist denke ich die Abstraktion.
Sobald die Methoden deklariert sind, kann dein C++-Programm / Klasse kompiliert werden.
Das heißt, du kannst die Syntax deines Codes mit der Kompilation überprüfen, ohne dass die Methoden implementiert sind.

Angenommen, du arbeitest mit einem Freund an einer gemeinsamen Klasse. Dann kannst du sagen, hey Dieter, implementier du mal die Methode foo(); ich mach derweil die Ein-/ Ausgabe.
Während Dieter deine Methode implementiert, kannst du also am Programm weiterschreiben, wenn du bereits weißt, was deine Methode zurückgibt und welche Parameter sie erwartet. Was du schreibst, kompiliert dann nämlich, nur Linken geht nicht ohne Implementierung.

Deshalb tut man normalerweise ausschließlich die Deklaration in die Header-Files. Implementieren kann man die Methoden dann wo man will :)

/edit: Naja mit ifdefs kann man das Problem der mehrfachen Einbindung ja umgehen :)
 
Zuletzt bearbeitet:
Intern wird das dann eh alles zusammengeworfen, also beim compilieren der .cc (bzw. cpp bei den windowsern) hast du ja oben das include Statement, sprich der Compiler bekommt das eh in einem Stück.
Andere Files die den Header der Klasse brauchen, bekommen aber auch nur den Header. Würdest du den Code so ohne weiteres in die Klasse reinpacken, gäbe das mitunter Probleme weil die Funktionen der Klasse dann mehrmals vorhanden sind.

Bei Templates dagegen muss im Moment noch die Implementierung in den header rein (oder man macht 'ne extra Datei die man per include im Header einbindet), aber da gibt's wohl auch schon eine elegante Lösung für, muss nur noch in die Compiler implementiert werden.

Also kurz: Bei kleinen Projekten kannst du den Code hinpacken wo du willst, bei größeren Sachen funktioniert das nicht, da brauchst du den Code extra.
 
Außerdem sind Methoden im header inline, wenn mich nicht alles täucht, so daß dies bei großen Methoden unangebracht ist, weil das sehr viel Code Duplikation mit sich bringt. Wenn man es im header nicht inline machen würde, steigt der Linker aus.
 
Wie schon erwähnt, die Teilung der Deklarationen und Implementierung der Methoden in Header und Source gehört zum guten Stil, sollte man sich angewöhnen.

Zwar beschleunigen inline Methoden ein Programm etwas, jedoch steht das nicht im guten Verhältnis zum Wachstum des Programms.
Man kann Methoden auch außerhalb der Header inline definieren, innerhalb jedoch hat man keine Wahl.

Zudem dienen die Header bei nicht vorhandener Dokumentation (laufendes Projekt) auch als Kommentarquelle. Dh. man muss sich nicht durch den ganzen Quellcode eines anderen durcharbeiten, sondern sieht alle Methoden auf einen Blick mit passendem Kommentar, was diese bewirken (wenn der Programmierer natürlich daran gedacht hat ;)).

Falls dir nicht klar ist, was inline bedeutet, man kann das in etwa mit Makros vergleichen (#define).
 
Zuletzt bearbeitet:
Zurück
Oben Unten