Warum funktioniert das? Struct im Struct...
-
struct letter{ struct partofword *p; int valid; }; struct partofword{ struct letter L[26]; };Generell, wieso funktioniert sowas?
Im ersten Struct lege ich ja vom Typ partofword an, aber der wird ja erst noch erstellt...
-
Es geht gar nicht.
Zumindest nicht ohne Vorwärtsdeklaration, die den Typen bekannt macht.
-
haider schrieb:
struct letter{ struct partofword *p; int valid; }; struct partofword{ struct letter L[26]; };Generell, wieso funktioniert sowas?
Im ersten Struct lege ich ja vom Typ partofword an, aber der wird ja erst noch erstellt...Im struct letter wird p als Zeiger auf das struct partofword definiert. Zeigertypen sind immer vollständig, auch wenn es der Typ, auf den gezeigt wird, ggf. nicht ist.
Diese Form der Deklaration sollte in C++ allerdings besser vermieden werden, weil die Bedeutung von der Reihenfolge der Deklarationen abhängt:
(1)struct partofword{ struct letter L[26]; }; struct letter{ struct partofword *p; // hier wird partofword durch unqualifiziertes lookup im umschließenden Namensraum gefunden // und p zeigt auf diese zuvor definierte Klasse int valid; };(2)
struct partofword; // Vorwärtsdeklaration struct letter{ struct partofword *p; // hier wird partofword durch unqualifiziertes lookup im umschließenden Namensraum gefunden // und p zeigt auf diese noch nicht definierte Klasse int valid; }; struct partofword{ // hiermit wird die Klasse, auf die letter::p zeigt definiert struct letter L[26]; };(3)
struct letter{ struct partofword *p; // partofword kann NICHT durch unqualifiziertes lookup gefunden werden // es wird somit die Klasse letter::partofword deklartiert und ein Zeiger auf diese Klasse definiert // das ist ganz analog zu // struct foo { ... } foo_objekt; // bei der Typ und Objekt in einer Deklaration definiert werden int valid; }; struct partofword{ // definiert die Klasse partofword, die mit der Klasse letter::partofword nichts zu tun hat struct letter L[26]; };struct foo bar;führt den Namen foo im jeweiligen Scope genau dann ein, wenn foo nicht durch unqualifiziertes Lookup gefunden werden kann. Im Gegensatz dazu bewirkt
struct foo;immer eine solche Injektion des Namens und
foo bar;nie. Hier besteht also eine Inkompatibilität mit C, wenn die betreffende Deklaration in einer Klassendefinition auftaucht.