Struct/Union im Struct/Union



  • Hi,
    Ich habe einen struct/union in dem ein weiter structs/unionen vorhanden sind - wie deklariere ich nun eine Variable, sodass ich auf alle structs/unioen zugreifen kann?
    Bsp:

    union MeineUnion
    {
        int Zahl1;
        int Zahl2;
        struct MeinStruct
        {
             char Zeichen1;
             char Zeichen2;
        }; 
    };
    
    int main()
    {
        MeineUnion Test;
        Test.Zahl1 = 1;
        Test.Zahl2 = 2;
        Test.MeinStruct.Zeichen1 = 'A';
        Test.MeinStruct.Zeichen2 = 'B';
    }
    

    Beim der ersten Zuweisung (also "Test.Zahl1 = ") und allen folgenden, streikt der Compiler mit der Meldung:

    error: invalid use of `struct MeineUnion::MeinStruct'
    


  • union MeineUnion {
        // ...
        struct {
            // ...
        } MeinStruct;
    };
    


  • Ahh, danke 😉
    Gibts da noch ander Schreibweisen oder ist diese die gänige/einzige?



  • geht darum, dass das struct nen anständiger member des unions wird. die variante

    struct {
    } name;
    

    definiert einen member vom "anonymen typ", wie vorher definiert. die schreibweise entspricht einer deklaration wie "int i;"

    kannst das struct auch ausserhalb des unions definieren und dann ne membervariable vom entsprechend typ ins union packen.

    struct Typ {
    };
    
    union U {
     int i;
     Typ t;
    };
    


  • Ok, danke...
    Die 2. Methode muss ich mal testen, ob ich die für meine Zwecke gebrauchen kann.



  • Pille456 schrieb:

    ...

    union MeineUnion
    {
        int Zahl1;
        int Zahl2;
        struct MeinStruct
        {
             char Zeichen1;
             char Zeichen2;
        }; 
    };...
    

    "Spezialfall" von

    struct MeinStruct1 // oder class
    {
        int Zahl1;
        int Zahl2;
        struct MeinStruct2
        {
             char Zeichen1;
             char Zeichen2;
        }; 
    };...
    

    Da kommt der Unterschied zwischen einer "inneren Klasse" (in C++) zu einem "inneren Objekt" (wie in Java) zum Tragen. Hier (innere Klasse) hast Du einfach einen weiteren Typ definiert ... aber noch keine Objekt dieser Klasse angelegt.
    Selbst dann nicht, wenn Du ein MeinStruct1-Objekt in der Hand hast, hast Du noch kein MeinStruct2-Objekt bekommen.
    Im Extrem habe die gar nichts miteinander zu tun:

    int main() {
       MeinStruct1 s1;
       MeinStruct1::MeinStruct2 s2; // -> beide Objekte sind voneinander unabhängig
       s1.Zahl1 = 7;
       s2.Zeichen1 = 'a';
    ...
    

    Ich denke, was Du meinst, ist:

    struct MeinZahlenStruct
    {
        int Zahl1;
        int Zahl2;
    };
    
    struct MeinZeichenStruct
    {
       char Zeichen1;
       char Zeichen2;
    }; 
    
    union MeineUnion {
       MeinZeichenStruct zeichen;
       MeinZahlenStruct zahlen;
    };
    

    Aber kleiner Tipp: unions beißen einen fast immer irgendwann in den Hintern !
    Und es gibt fast immer bessere Lösungen dafür. 😃

    Gruß,

    Simon2.



  • Die den dummen Nebeneffekt einer Union will ich ja "misbrauchen", daher ist dies in meinem Fall die Beste Lösung. Und genau darum müssen die auch ineinadner verschachtelt sein 🙂

    Hier hab ich ein gutes Beispiel dazu gefunde, was ich damit mache (im übrigen wirds da auch Erklärt :D, aber das wusste ich ja gerstern nicht^^)
    http://www.it-academy.cc/article/1345/Binaere+Darstellung+in+C+C++.html



  • Pille456 schrieb:

    Die den dummen Nebeneffekt einer Union will ich ja "misbrauchen", daher ist dies in meinem Fall die Beste Lösung. Und genau darum müssen die auch ineinadner verschachtelt sein :-)...

    Wer ".... muss geschachtelt sein ..." ? Die Klassen oder die Objekte ?
    Zweiteres glaube ich - Ersteres nicht. :p 😉

    Aber wenn Du Dein Problem schon gelöst hast, ist ja alles prima ! 👍 🕶

    Gruß,

    Simon2.


Anmelden zum Antworten