Ist ein CArray aus structs, welches ein union hat, bedenklich
-
Warum machst nicht einfach ne Struktur die einfach "id" und "lbl" enthält.
-
............. schrieb:
Ich denke das wissen die Leute aus dem C++ Unterforum besser.
stimmt zwar, heißt aber nicht, dass wir das hier nicht wissen^^
Dein Prob wird sein, dass das CString-Objekt 2 mal freigegeben wird. Unions mit Objekten sind meist auch nicht so wirklich sinnvoll.
-
Ich glaube, das Problem ist eher die Kombination aus union und C++-Klasse - der Compiler weiß einfach nicht, ob er beim Zerstören deiner Konstruktion den Destruktor von foo_lbl oder bar_lbl aufrufen soll (im zweiten Quelltext verwendet er beide).
-
Das ist nur gekürzter Pseude-Code. Im richtigen Code haben die structs des unions eine unterschiedliche Anzahl an membern.
Aber ich glaube ich weiss jetzt woran es liegt. Und zwar am CString. Wenn ich CHAR* benutze passiert es nämlich auch nicht. Denn normaleweise beschwert sich ja der Compiler, wenn mam folgendes macht:
union Bla { CString str; int i; };Der Fehler lautet dann, dass ein union-member keinen Kopierkonstruktor haben darf.
Deswegen denke ich, dass mein Versuch eine üble Umgehung dieses Compilerfehlers ist.
-
Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was soll jemand im C++-Forum über CString und CArray wissen.

-
damit bestätigt sich meine Vermutung. Danke.
Jetzt denke ich auch, dass dieser Beitrag eher ins C++-Forum gehört, denn mit std::vector und std::string passiert das gleiche.
-
Redhead schrieb:
Was soll jemand im C++-Forum über CString und CArray wissen.

Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions
-
rat_suchender schrieb:
Hallo,
ist folgender Code falsch:
struct Foo { BOOL is_foo; union { struct // if (is_foo) { int foo_id; CString foo_lbl; }; struct // if (!is_foo) { int bar_id; CString bar_lbl; }; }; }; CArray<Blubb, Blubb> arr; // liegt auf dem stackJa, ist er.
Nested Classes in einer anonymen Union sind nicht erlaubt (Standard: 9.5 Cl. 2).
Und dann noch das eigentliche (9.5 Cl. 1)
An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.Nontrivial bedeutet dabei: selbst implementiert (und damit nicht compiler-generiert) - oder eines in der Klasse enthaltenen Objekte hat einen nicht-trivialen XXX (alle 4 Varianten einsetzen).
-
Pellaeon schrieb:
Redhead schrieb:
Was soll jemand im C++-Forum über CString und CArray wissen.

Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions
So sehe ich das auch.
