Klassen vordefinieren ?
-
Ich hab mehrer Klassen die sich gegenseitig bedingen, wenn ich nun die eine als erst in meiner Headerdatei definiere fehlt die andere und so weiter..
Wie kann ich in der Headerdatei die Klassen so art vordiefinieren, dass die erst Klasse schonmal etwas von der kommenden Klasse weiß?
Gruss Christian!
-
Das nennt sich forward declaration und sieht so aus:
// ClassA.h // forward declaration für Klasse B class ClassB: class ClassA { ClassB* pointer_to_B; };// ClassA.cpp #include "ClassB.h"// ClassB.h #include "ClassA.h" class B { ClassA obj_of_A; };Wie dir sicher auffällt, ist B ein Zeiger in Klasse A und A ein Objekt in Klasse B. Bei gegenseitiger Mitgliedschaft kann nur eins von beiden Objekten als vollwertiges Objekt angelegt werden, das andere muss als Zeiger realisiert werden.
Der Grund dafür ist, dass der Compiler ein Speicherlayout für jede Klasse erzeugen muss (damit er weiss, an welchem Offset sich welche Elemente befinden). Das kann er allerdings nur, wenn er genau weiß, wie groß jedes Element ist. Wären beide Klassen Bestandteil des jeweiligen Partners ginge das nicht, denn um festzustellen, wie groß Objekt A ist müsste der feststellen, wie groß Objekt B ist. Dazu müsste er wieder gucken, wie groß Objekt A ist, wozu er wiederum gucken müsste, wie groß Objekt B ist... und so weiter.
-
Hmm, also dein Satz ist etwas wirr. Falls es dir leichter fällt geht auch Englisch oder so.
Ich glaube aber, dass dir eie Forward Declaration helfen könnte. Das könnte dann z.B. so aussehen:
class B; class A { B * b; }; Class B { };Hoffe, dass ich deine Frage beantworten konnte.
*Edit:
Ich bin natürlich mal wieder zu langsam ^^
-
Das ist eine forward Deklaration:
// a.h class B; // forward deklaration class A { public foo(const B& x); // verwendet eine Referenz auf ein B. Definition von B ist wurscht. bar(B* x); // Zeiger: dito private: B* b; // dito };// b.h #include "a.h" class B { private: A x; // Die Größe von A muss bekannt sein. Daher muss die Defintion durch #include "a.h" bekannt gegeben werden. };
-
Dankeschön, das hilft mir sehr weiter.

Gruss Christian
-
Wenn du noch ein paar Informationen mehr willst: hier.
-
Den Link kann ich nur empfehlen, denn dank ihm hab ichs dann auch endlich irgendwann mal geschnallt:D
Lg freeG