Ich habe versprochen, auf die eigenartigen Präprozessoranweisungen in den Zeilen 4, 5 und 19 von VEHIKEL.H zurückzukommen. Nun ist die Zeit reif. Wenn wir die abgeleitete Klasse Auto definieren, müssen wir die gesamte Definition der Schnittstelle der Klasse Vehikel zur Verfügung stellen, da Auto eine von Vehikel abgeleitete Klasse ist und alles über die Basisklasse wissen muß. Wir tun dies, indem wir die header-Datei der Klasse Vehikel in die Klasse Auto importieren. Aus dem gleichen Grund müssen wir sie auch in die Klasse Laster importieren.
Schließlich müssen wir auch das Programm ALLEVEH.CPP über die Details der drei Klassen informieren und deshalb die header-Dateien importieren, was wir in den Zeilen 3 bis 5 auch tun. Das führt aber zu einem Problem. Wenn der Präprozessor zur Klasse Auto kommt, importiert es die Klasse Vehikel, da sie in der header-Datei der Klasse Auto aufgeführt ist. Da aber die Klasse Vehikel schon in Zeile 3 von ALLEVEH.CPP importiert wurde, wird sie zweimal importiert und wir versuchen damit, die Klasse Vehikel noch einmal zu deklarieren. Natürlich ist die Deklaration dieselbe, was das System aber nicht weiter kümmert: es verbietet schlicht und einfach eine zweite Deklaration einer Klasse. Wir gestatten das zweifache Importieren der Datei und verhindern gleichzeitig das zweifache Importieren der Klasse mit dem Wort VEHIKEL_H. Wenn das Wort schon definiert wurde, wird die Deklaration der Klasse übergangen, wurde es aber noch nicht definiert, wird die Deklaration importiert und gleichzeitig VEHIKEL_H definiert. Das Endergebnis dieses Kunstgriffs ist, daß die Klasse nur einmal importiert (und damit deklariert) wird, obwohl wir die Datei öfters importieren. Du solltest kein Problem haben, die Logik zu verstehen, wenn Du Dich kurz damit auseinandergesetzt hast.
Obwohl ANSI-C mehrfache Deklarationen erlaubt, solange sie identisch sind, verbiete C++ dies. Der Hauptgrund dafür ist, daß es für den Compiler sehr schwierig wäre, festzustellen, ob er schon einen Konstruktoraufruf für ein nochmals definiertes Element gemacht hat. Ein wiederholter Konstruktoraufruf für ein einzelnes Objekt kann ziemlichen Unsinn anrichten, also wurde das von vornherein ausgeschlossen, indem per Definitionem wiederholte Definitionen verboten wurden. Das stellt in keinem praktischen Programm ein Problem dar.
Wir haben den Namen VEHIKEL_H gewählt, weil es sich dabei um den Namen der Datei handelt, wobei der Punkt durch eine Unterstrich ersetzt wurde. Wenn Du das konsequent mit allen Deinen Klassen so hältst, kann es nie zu Namenskonflikten kommen, da jede Datei einen eigenen Namen haben muß, solange sich alle in einem Verzeichnis befinden. Es ist sicherlich gut, sich an diesen Kunstgriff zu gewöhnen. Alle weiteren header-Dateien in dieser Einführung werden ihn verwenden, um wiederholte Definitionen von Klassen zu verhindern und um Dir ein Beispiel zu sein. Du solltest das wirklich in allen Klassendefinitionen verwenden, wie trivial sie auch sein mögen.
Copyright © 1997, 1998, 2001-2006 Heinz Tschabitscher - Letzte Änderung 15. Dezember 2005
Heinz Tschabitscher - | Datenschutz | Impressum - Kommentare, Kritik, Anregungen, Fragen?