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.


  • Mod

    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.


Anmelden zum Antworten