Deklaration von "struct"



  • Hallo,

    ich möchte in einer Header-File die Klasse

    struct Tt;
    

    NUR bekannt machen (deklarieren) und in der zugehörigen cpp-File definieren

    struct Tt{int a; void f()}
    

    Beim compilieren geht alles gut und es funktioniert auch. ABER:

    Die beim comilieren entstandene obj- File nutze ich in einem anderen Projekt. Ich "include" die Header- File und möchte jetzt ein Objekt der (eigentlich bekannten) Klasse Tt anlegen. Der Compiler sagt er kennt die struktur Tt nicht!?!?!?! Warum??? Was ist der Ausweg?? 😕



  • Hallo,

    du musst extern im header davorschreiben.

    extern struct Tn;
    

    und in genau einem .cpp File definieren.



  • templäd schrieb:

    Hallo,

    du musst extern im header davorschreiben.

    extern struct Tn;
    

    und in genau einem .cpp File definieren.

    Das war auch meine erste Vermutung, aber der Compiler meckert und sagt "E2092 Speicherklasse 'extern' ist hier nicht erlaubt."



  • Ich hb das so gelernt, dass im header der komplette Strukt stehen muss, da es sich ja um einen neuen Datentyp und keine Funktion handelt. Woran soll man sonst erkennen, was man alles an Daten in den struct packen kann. Bei klassen macht man dass doch enauso, nur dass man da die methoden selbst erst in der cpp file deklariert. Das extern wird imho nur beim anlegen von globalen Variablen gebraucht.



  • Ok das kann natürlich sein. Wenn ich jetzt ganauer darüber nachdenke macht es auch keinen Sinn die Definition zu verbergen, da der Anwender ja wissen muss welche Datenelemente bzw Elementfunktionen es gibt. Die Elementfunktionen kann ich ja nach wie vor in der cpp- File definieren. 💡

    Auf was für schräge Dinge man kommt wenn man sich in eine Sache verrennt ts ts ts.

    Danke Euch!!! 🙂



  • Nicht nur der Benutzer muss wissen, mit welchen Elementfunktionen er auf die inneren Daten des structs zugreifen kann,
    sondern auch der Compiler muss wissen, wie groß Objekte dieses Typs sind, um entsprechend Speicherplatz
    zu reservieren.
    Von daher sind Datentypen wie 'enum' oder 'struct' in der Headerdatei nicht nur zu deklarieren, sondern auch zu definieren.


  • Mod

    extern struct Tn;
    

    ist eine deklaration des typs Th. allerdings ist extern nur bei der deklaration von objekten und funktionen zulässig. möglich wäre also

    extern struct Foo foo;
    

    hier wird ein typ Foo und ein objekt foo vom typ Foo deklariert. falls Foo bereits vorher deklariert wurde, ist das struct überflüssig. all das ändert nat. nichts daran, dass man nur wenige sachen mit einer solchen deklaration anfangen kann, bis der typ Foo vollständig ist (d.h. definiert wurde).



  • Bobby - Karle schrieb:

    Nicht nur der Benutzer muss wissen, mit welchen Elementfunktionen er auf die inneren Daten des structs zugreifen kann,
    sondern auch der Compiler muss wissen, wie groß Objekte dieses Typs sind, um entsprechend Speicherplatz
    zu reservieren.

    Die Grösse des structs bekommt doch der Compiler beim anlegen des Objekts mit, da er ja dann auch schon die Definition der Klasse "gesehen" hat.



  • kingvik387 schrieb:

    Bobby - Karle schrieb:

    Nicht nur der Benutzer muss wissen, mit welchen Elementfunktionen er auf die inneren Daten des structs zugreifen kann,
    sondern auch der Compiler muss wissen, wie groß Objekte dieses Typs sind, um entsprechend Speicherplatz
    zu reservieren.

    Die Grösse des structs bekommt doch der Compiler beim anlegen des Objekts mit, da er ja dann auch schon die Definition der Klasse "gesehen" hat.

    Ja, wenn er die Definition der Klasse gesehen hat 😉 Wenn da nur eine Forward-Deklaration war, hat der Compiler ein Problem.


Anmelden zum Antworten