Wie macht man die Headers richtig?

Cruz

Cruz

No Bullshit
Einen hab ich noch. :)

Als Java Programmierer kann ich mich mit den Header Files von C++ nur schwer anfreunden. Ich habe noch nicht wirklich begriffen, warum es sie gibt und wie man es am besten macht.

Einserseits höre ich die Aussagen von Freunden, die sagen, dass man im Header nur das public interface einer Klasse definieren sollte. Sie sind dafür da, dass man eine Header Datei + die kompilierte Klasse verteilen kann und man nicht immer Source Code mitgeben muss.

Anderseits sehe ich in Beispielen, dass die Felder einer Klasse im Header deklariert sind und das geht gegen die erste Aussage, denn die Felder selbst gehören bestimmt nicht zum public interface. Aber in diesen Beispielen gibt es gar keine Klassendefinition class Name {} in der cpp Datei, also gäbe es ja gar keine andere Möglichkeit, als die Felder im Header zu definieren. Wie macht man es also richtig?

Und noch eine Detailfrage dazu. In Java pflege ich die primitiven Felder der Klassen direkt bei der ersten Deklaration mit einem default Wert zu initialisieren, damit man nicht jedes Feld auch noch im Konstruktor extra aufführen muss. Kann ich das in C++ auch so handhaben?

Viele Dank
Cruz
 
Hi,

Ich habe noch nicht wirklich begriffen, warum es sie gibt und wie man es am besten macht.
Der Hauptgrund fuer die Existenz von Headerdateien ist, dass Variablen, Funktionen und Klassen in C++ deklariert werden muessen, bevor sie benutzt werden koennen. Und damit du die Deklaration nicht jedes Mal von Hand machen musst wenn eine Klasse oder Funktion gebraucht wird, schreibst du die Deklaration in eine Headerdatei. Dann musst du nur noch die Headerdatei einbinden, um die gewuenschte Funktion (etc.) benutzen zu koennen.

Wie man es am Besten macht... Ich denke das ist Geschmacksache, und haengt teilweise auch von der konkreten Anwendung ab. Worueber man sich im klaren sein sollte, ist dass jegliche Implementation die man in eine Headerdatei schreibt, automatisch "inline" ist. D.h. fuer eine Methode die man direkt in der Headerdatei implementiert, wird, wo immer diese Methode aufgerufen wird, der Code der Methode dupliziert. Ueber die Vor- und Nachteile will ich hier nicht Philosophieren, dafuer habe ich selber etwas zu wenig Ahnung von der Materie. Zumal meine Erfahrungen damit auch meiner Intuition wiedersprechen.

Einserseits höre ich die Aussagen von Freunden, die sagen, dass man im Header nur das public interface einer Klasse definieren sollte. Sie sind dafür da, dass man eine Header Datei + die kompilierte Klasse verteilen kann und man nicht immer Source Code mitgeben muss.
Das ist nicht ganz falsch, aber statt Interface wuerde ich von der Klassen Definition sprechen.

Anderseits sehe ich in Beispielen, dass die Felder einer Klasse im Header deklariert sind und das geht gegen die erste Aussage, denn die Felder selbst gehören bestimmt nicht zum public interface.
Ja, wenn man von der korrekten Definition des Begriffs Interface ausgeht, stimmt das wohl. Wie oben gesagt, ich wuerde eher von der Klassen Definition sprechen. Ich weiss gar nicht genau ob man gezwungen ist die Variablen Definition in der Klassen Deklaration selbst zu machen, aber ich glaube schon. In der Praxis kann ich mich nicht daran erinnern das jemals anders gesehen zu haben. Aber vielleicht weiss jemand Anderes hier mehr darueber.

Aber in diesen Beispielen gibt es gar keine Klassendefinition class Name {} in der cpp Datei, also gäbe es ja gar keine andere Möglichkeit, als die Felder im Header zu definieren. Wie macht man es also richtig?
Ich glaube man kann "von aussen" den "Scope" der Variablen nicht mehr festlegen, weswegen ich vermute dass die Deklaration tatsaechlich in der Klassen Deklaration geschehen muss.

Aber das hier:
also gäbe es ja gar keine andere Möglichkeit, als die Felder im Header zu definieren
ist nicht ganz richtig, denn wenn das stimmen wuerde, muesstest du die Implementation ja auch direkt in den Header schreiben. Du kannst von aussen durchaus via Angabe des Namespaces auf Methoden und Variablen zugreifen, was z.B. fuer Methoden und statische Variablen normalerweise gemacht wird:
Code:
// CClassName.cpp
void ClassName::printBar(){ std::cout << "bar"; }
ClassName::myVar = new Var()

Und noch eine Detailfrage dazu. In Java pflege ich die primitiven Felder der Klassen direkt bei der ersten Deklaration mit einem default Wert zu initialisieren, damit man nicht jedes Feld auch noch im Konstruktor extra aufführen muss. Kann ich das in C++ auch so handhaben?
Gute Frage, naechste Frage. ;)
Ist schon wieder so lange her dass ich was in C++ geschrieben hab... Konkret muesste ich das auch wieder nachlesen, ich meine aber dass das in C++ nicht geht. Variablen kannst du im Konstruktor unter anderem auch so initialisieren:
Code:
class Foo()
{
private:
   int myInt;
   double myDouble
public:
   Foo() : myInt(10), myDouble(0.3) // myInt = 10, myDouble = 0.3
   {
      // constructor goes here
   }
};
Aber ansonsten wuerde ich sagen, probier doch einfach mal aus ob die Java Variante auch funktioniert. ;)

mfg,
bytepool
 
Zuletzt bearbeitet:

Ähnliche Themen

Array in einer Klasse

Zurück
Oben