Struktur in Union in Klasse
-
Hallo zusammen
Ich möchte verschiedenen Strukturen (Ok, erst mal eine) in einer Union (dynMsgs_t) speichern.
Diese Union befindet sich in einer Oberstruktur (tcpResponse_t), und das ganze als public in einer Klasse.Also so:
class test { public: //structure for statuscd typedef struct { int iOperation; int iPlayState; int iCurrentTrack; AnsiString sCurrentTrackTime; AnsiString sRemainigAlbumTime; AnsiString sTotalAlbumTime; }statusCd_t; //union with dynamic messages typedef union { statusCd_t t; int i; }dynMsgs_t; ///structure to save response data typedef struct { int iLastId; tcpResponseType_t type; AnsiString sData; AnsiString sData2; int iData; dynMsgs_t msg; //Union }tcpResponse_t; }
Wenn ich das ganze nun kompiliere kommt der folgende Fehler:
[BCC32 Fehler] NaimNet.h(47): E2456 Union-Member 'test:: ::t' ist vom type einer Klasse mit Konstruktor
Was mach ich falsch?
MfG Stephan
-
1. Unions sind in der Regel böse. Wozu brauchst du das, bzw. wozu glaubst du das zu brauchen?
2. Non-PODs in Unions sind noch viel böser. Verboten böse. Und das ist, warum es hier nicht zugelassen wird.
3. Die Fehlermeldung ist doch eigentlich eindeutig, oder? Aber wenigstens bist du nun gezwungen, deine union-Pläne öffentlich zu diskutieren und verwirfst sie vielleicht.
-
typedef struct { } name; ist in C++ im Gegensatz zu C nicht nötig. Es reicht ein struct name {};, das hat den gleichen Effekt.
Auf UN solltest du verzichten.
-
Also, dein Problem ist der AnsiString.
Da dies ein Non-POD-Typ ist, wird statusCd_t automatisch auch Non-POD.
unions dürfen allerdings nur PODs enthalten.Falls du mit POD nichts anfangen kannst, siehe hier:
What are POD types in C++? - Stack Overflow
-
Hallo zusammen und besten Dank für die Antworten
Das Unions nicht einfach zu handhaben sind ist mir klar. Allerdings reden wir ja auch von C/C++ und nicht von BASIC o.ä..
Ich bin der Meinug eine Union zu benötigen, da ein Ethernetgerät verschiedene Infos an mein Programm schickt.
Dieses inperpertiert die Daten und füllt je nach Infotyp (können bis zu 50 verschiedenen sein) eine entsprechende Struktur welche in eine Queue kopiert wird. Die Queue wird dann von der GUI weiterverarbeitet.
Und genau diese 50 Infotypen-Strukturen will ich in der Union ablegen.
Es gibt mit Sicherheit viele andere Lösungsmöglichkeiten, wer hat Ideen?
Das mit den non PODs war mir so bisher nicht bekannt, jedoch man lernt ja nie aus.Was mir allerdings nicht klar ist, warum Unions nicht verwendet werden sollen.
Ist der einzige Grunde, daß es einfach unübersichtlich ist und eventuell auf den falschen Typ zugegriffen wird, oder gibt es noch andere.MfG Stphan
-
Unions sollen primär nicht benutzt werden, weil unerfahrene Leute damit zu Dummheiten neigen.
Unions sind nicht 100% portabel, da gewisse Funktionalitäten eben von der Implementation abhängen.
Soll heißen, der relativ bekannte "Union-Cast", könnte theoretisch bei irgendeinem C++ Compiler nicht funktionieren.
Das wäre immer noch Standard-konform.Ein Beispiel für den Union-Cast:
// sowieso nur sinnvoll, wenn beide Typen gleich groß sind template <typename ValueType> union ptr_num_caster { unsigned int address_; ValueType * pointer_; }; // irgendwo im Code float * foo = new float[10]; ptr_num_caster<float> caster; // der folgende Code ist nicht portabel, // laut standard darf man nur das element abfragen, welches zuletzt geschrieben wurde // hier wird aber pointer_ geändert und address_ ausgelesen. // das funktioniert zwar in der Regel, muss aber nicht caster.pointer_ = foo; unsigned int addr = caster.address_;
Achja, in C++11 wurden die Restriktionen für Unions gelockert.
Man kann jetzt auch PODs verwenden.
Du musst allerdings in der Dokumentation deines Compilers nachschlagen,
in wiefern dieser den neuen Standard bereits unterstützt (die meisten Compiler unterstützen nur ein paar neue Features) und evtl. wie man dies aktiviert.MSVC10 z.B. verwendet automatisch C++11, während man den GCC (g++) erst mit dem Parameter -std=c++0x dazu animieren muss
Zu unrestricted Unions siehe hier.
-
@DrakoXP
Danke für die Infos.
Das deckt sich ja ziemlich mit meiner Einschätzung und ich weiß nun was ich zu tun bzw. zu lassen habe.MfG Stephan