Ist es möglich, mehrere Objekte in einer Union zusammenzufügen?

9

Was ist, wenn ich folgendes habe:

%Vor%

Natürlich werde ich nur einen der drei Vektoren verwenden. Aber ... was passiert, wenn alle 3 Vektoren konstruiert sind?
Würden sich die Konstruktoren der 3 Vektoren gegenseitig stören? (da die 3 von ihnen in der gleichen Speicheradresse sind)

Danke.

    
GetFree 12.04.2009, 08:47
quelle

5 Antworten

15

Der aktuelle C ++ - Standard erlaubt keine Nicht-POD-Typen innerhalb von Unionen. Sie erhalten diesen Compilerfehler von gcc :

%Vor%

Neuer C ++ - Standard ( C ++ 0x ) schlägt uneingeschränkte Gewerkschaften , aber es fügt C ++ noch weitere Objektlebensdauerfehler hinzu.

    
Alex B 12.04.2009, 08:48
quelle
8

Sie können keine Unionen mit Nicht-POD-Klassentypen haben. Ihre Probe wird nicht kompiliert.

Sie können boost::variant als sichere Alternative zu C-Unionen verwenden. Siehe die Dokumentation auf boost.org . Sie könnten jedoch Ihr Design überdenken und stattdessen Polymorphismus verwenden. Das hängt natürlich davon ab, was Sie erreichen wollen.

    
avakar 12.04.2009 08:48
quelle
2

Aus dem C ++ Standard, Abschnitt 9.5:

  

Ein Objekt einer Klasse mit einem   nicht-trivialer Konstruktor (12.1), a   nicht-trivialer Copy-Konstruktor (12.8), a   nicht-trivialer Destruktor (12.4), oder a   nicht-triviale Kopierzuweisungsoperator   (13.5.3, 12.8) kann kein Mitglied eines sein   Vereinigung,

Hier, für "nicht-trivial" lesen Sie "nützlich": -)

    
anon 12.04.2009 08:52
quelle
2
  

Würden sich die Konstruktoren der 3 Vektoren gegenseitig stören? (da die 3 von ihnen in der gleichen Speicheradresse sind)

Der C ++ - Standard lässt Ihr Programm nicht zu, so ist es (bestenfalls!) implementierungsdefiniert was passiert.

Wenn beispielsweise Ihre Implementierung alle drei Standardkonstruktoren aufruft und diese alle Speicher zuordnen und den Zeiger auf den neu zugewiesenen Speicherbereich speichern, haben Sie ein Speicherleck (die ersten Zwei Zuweisungen werden von der dritten überschrieben) / p>

Wenn die Destruktoren alle aufgerufen werden und sie alle "ihre" Erinnerung freigeben, machen Sie eine doppelte Freiheit (dreifach, auc); Dies wird wahrscheinlich die Zuordnungsdatenstruktur beschädigen, was eine schlechte Sache ist. Sei glücklich, wenn du abstürzt, weil es viel schwieriger zu debuggen ist, wenn du es nicht tust.

Ich denke, diese Probleme könnten sein, warum der Standard dies nicht zulässt.

(Eine etwas sensiblere Sache könnte sein, nur die erste Klasse standardmäßig zu konstruieren, aber das ist immer noch nicht sensibel, nur weniger verrückt ...)

    
Jonas Kölker 12.04.2009 08:55
quelle
1

Vielleicht möchten Sie sich auch Boost.Variant ansehen, die dies können enthält einen einzelnen Wert verschiedener Typen.

    
Simon Broadhead 12.04.2009 08:52
quelle

Tags und Links