invalid use of 'union xxxx'



  • Hallo zusammen.

    Ich habe ein ziemlich verpacktes struct, dass eine union enthält und dann wieder ein struct.

    Aber leider kann ich auf die unteren Ebenen nicht zugreiffe weil sonst der Fehler 'invalid use of 'union ISSDef::ISSrequestRecT::EventClass' erscheint.

    struct:

    struct ISSrequestRecT{
            union EventClass{
                struct TKHeventClass{
                    TKHeventRecT tkhEvent;
                };
                struct RAKeventClass{
                    RAKeventRecT rakEvent;
                };
                struct PASeventClass{
                    PASeventRecT pasEvent;
                };
                struct FLUeventClass{
                    FLUeventRecT fluEvent;
                };
                struct ANAeventClass{
                    ANAeventRecT anaEvent;
                };
                struct SWEeventClass{
                    SWEeventRecT sweEvent;
                };
            };
        };
    

    Aufruf

    rISSPacket.request.EventClass.rakEvent.insertCodeLW
    

    Kann mir jemand von euch weiterhelfen?

    Gruss, Dane


  • Mod

    EventClass enthält kein Feld namens rakEvent. Es enthält überhaupt nichts, nur ein paar lokale Klassendefinitionen. Und auch ISSrequestRecT enthält nichts, außer einer lokalen Uniondefinition namens EventClass.

    Bevor ich das aber verbessere: Überdenke dein Design. Gerade bei der Benutzung von Union schellen in C++ alle Designfehleralarmglocken.



  • Wie kann ich dann auf die unteren Elemente zugreiffen?
    rakEvent, pasEvent, etc.? 🙂


  • Mod

    Dane__ schrieb:

    Wie kann ich dann auf die unteren Elemente zugreiffen?
    rakEvent, pasEvent, etc.? 🙂

    Gar nicht. Es gibt diese Elemente gar nicht. Denke erstmal selber darüber nach, wieso das so ist, sonst verstehst du die Lösung nicht.

    Und wie schon gesagt, wäre die direkte Lösung vermutlich sowieso total vermurkstes Design.



  • Das EventClass ist glaube zu viel.



  • Ich glaube ich verstehe den Sinn & Zweck von diesen structs in diesem Falle nicht.

    Für mich ist ein struct / union eine ganz einfache Verschachtelung von Datentypen.
    Der Unterschied zw. struct & union ist, dass man bei struct auf alle Elemente zugreiffen kann und bei einem Union immer nur auf eines.

    Ich muss zugeben ich befinde mich noch auf dünnem Eis was das Ganze angeht. 😉

    cheers


  • Mod

    Dane__ schrieb:

    Ich muss zugeben ich befinde mich noch auf dünnem Eis was das Ganze angeht. 😉

    Du hast hier etwas viel Grundlegenderes nicht verstanden:

    // Dies ist die Deklaration der Klasse foo. Statt class kann da auch struct oder union stehen:
    class foo{
    };
    
    // foo ist von nun an ein Datentyp im Programm:
    foo bar;
    // bar ist ein Objekt vom Typ foo. Es gibt aber kein Objekt mit Namen foo.
    
    // Es gibt auch noch eine ältere, selten benutzte Möglichkeit das gleiche zu erreichen:
    class foo{
    } bar;
    // foo ist jetzt ein Datentyp und bar ist ein Objekt vom Typ foo
    


  • Hallo,

    Ja das Ganze ist mir schon klar.

    Ich erstelle ja auch ein Objekt vom Typ ISSrequestRecT.

    struct ISStcpPacketT{
            unsigned short int length;
            ISSrequestRecT request; // <--
        };
    
    ISStcpPacketT rISSPacket;
    

    Nun will ich über das erstellte Objekt request auf die anderen Datentypen zugreiffen.

    Hmm.. Wobei ich glaube langsam leuchtet es mir ein.
    Müsste ich also anstatt

    struct ISSrequestRecT{
            union EventClass{
                struct TKHeventClass{
                    TKHeventRecT tkhEvent;
                };
                struct RAKeventClass{
                    RAKeventRecT rakEvent;
                };
                struct PASeventClass{
                    PASeventRecT pasEvent;
                };
                struct FLUeventClass{
                    FLUeventRecT fluEvent;
                };
                struct ANAeventClass{
                    ANAeventRecT anaEvent;
                };
                struct SWEeventClass{
                    SWEeventRecT sweEvent;
                };
            } ;
        };
    

    Sowas in der Art Zusammenbasteln?

    struct ISSrequestRecT{
            union EventClass{
                struct TKHeventClass{
                    TKHeventRecT tkhEvent;
                } myTKHeventClass;
                struct RAKeventClass{
                    RAKeventRecT rakEvent;
                } myRAKeventClass;
                struct PASeventClass{
                    PASeventRecT pasEvent;
                } myPASeventClass;
                struct FLUeventClass{
                    FLUeventRecT fluEvent;
                } myFLUeventClass;
                struct ANAeventClass{
                    ANAeventRecT anaEvent;
                } myANAeventClass;
                struct SWEeventClass{
                    SWEeventRecT sweEvent;
                } mySWEeventClass;
            } myEventClass;
        };
    

    ?

    Und dann mittels

    rISSPacket.request.myEventClass.myTKHeventClass.tkhEvent.event = TKHreconstituted;
    

    zugreiffen?

    grz


  • Mod

    Ja.



  • Warum legst du überhaupt diese ganzen Strukturen mit nur einem Member an?


  • Mod

    Paul Müller schrieb:

    Warum legst du überhaupt diese ganzen Strukturen mit nur einem Member an?

    Noch mehr Designfehler. Aber die Hinweise darauf werden ja ohnehin ignoriert. Die technischen Aspekte der Frage sollten aber wohl beantwortet sein.



  • Vielleicht kommt später da noch etwas dazu.

    Ansonsten macht mir doch Vorschläge wie ihr das ganze aufbauen würded.

    grz



  • Naja, die ganzen struct s weglassen, die Member aber behalten.



  • Das hängt natürlich in erster Linie von den Details ab, die du erst später vielleicht noch nachreichen willst. Wie man etwas macht, hängt in erster Linie davon ab, was man erreichen will. Statt einer Union könnte man es aber auch mit Polymorphie probieren. Dass ist nicht nur sicherer als eine Union, sondern erleichtert auch die Umsetzung enorm. Weil du nicht mehr wissen musst welches Event den nun genau in der Union liegt.


Anmelden zum Antworten