M
_c0mpiler schrieb:
Also die beiden Klassen stimmen schon die ich dir reingestellt habe.
Du bekommst also in Flugzeugtraeger.hpp die Fehlermeldung, dass Schiff nicht bekannt ist?
_c0mpiler schrieb:
Das mit dem zyklischen Includieren hab ich meiner Meinung nach auch nicht ich hab das ganze Projetk nochmal durchgeschaut und find ich nichts zyklisches.
Schau bitte mal in "GrafikFenster.hpp" und "GrafikText.hpp" nach. Ich vermute stark, dass in einer dieser Dateien - oder in irgendeiner Datei, die in diesen Dateien per Includedirektive eingebunden wird - wiederum Flugzeugtraeger.hpp eingebunden wird.
_c0mpiler schrieb:
Mich würde aber trotzdem interesieren warum das mit den Direktiven nicht funktioniert. Könntest du mir das Erklären?
Includedirektiven bewirken einfache Textersetzungen. Eine mittels #include eingebundene Datei landet damit vor der Datei, in der die Includedirektive steht. Die Direktiven legen also die Reihenfolge fest.
Die Include-Guards bewirken, dass dabei keine Datei wiederholt wird, die schon einmal eingebunden wurde.
Wenn du zyklische Direktiven hast, bedeutet das, dass sich eine Datei (meist über mehrere andere Dateien) selbst einbindet. Du hast also eine Art Schleife in deinen Direktiven.
Wenn wirklich alle Inkludedirektiven der Schleife notwendig sind, kann dein Programm nicht kompiliert werden, weil mindestens eine Abhängigkeit nicht erfüllt ist.
Beispiel:
A.hpp -> #include B.hpp
B.hpp -> #include C.hpp
C.hpp -> #include A.hpp
Wenn jetzt in D.cpp A.hpp eingebunden wird, haben wir diese Reihenfolge:
C.hpp
B.hpp
A.hpp
D.cpp
Trotz der Includedirektive in C.hpp ist also der Inhalt von von A.hpp nicht in C.hpp verfügbar.
Wenn du in D.cpp eine andere Headerdatei einbindest, verschiebt sich das Ganze nur. Aber es bleibt dabei, dass eine Inkludedirektive des Zyklus' nichts bewirkt. Die Include-Guards bewirken nur, dass der Kreis abbricht, aber wo das passiert, und welche Direktive wirkungslos bleibt, hängt vom Inhalt ganz anderer Dateien ab. Es kann natürlich auch sein, dass die Reihenfolge der Header für zwei Übersetzungeinheiten unterschiedlich ist. Und das ist etwas, was man als Ersteller von Headerdateien sicher nicht will.
Wenn nicht alle Inkludedirektiven notwendig sind, lass einfach die unnötigen weg.