2009-08-05 7 views
2

Ich habe eine Vereinigung bekam:initialisieren Aggregat Gewerkschaften

union my_union 
{ short int Int16; float Float; }; 

Ich mag würde erstellen:

const my_union u1 = ???; 
const my_union u2 = ???; 

und ihre Werte initialisieren jeweils unterschiedlicher Art sein: u1 -> int16 u2 -> float

Wie mache ich das? Wenn das oben genannte nicht möglich ist, gibt es Workarounds?

Antwort

10

Vereinigung kann eine beliebige Anzahl von Konstrukteuren hat - dies für alle Datentypen ohne Konstruktor arbeiten, so dass Ihr Beispiel ist gut, wenn der String ausschließen (oder Zeiger auf String machen)

#include <string> 
using namespace std; 
union my_union 
{ 
    my_union(short i16): 
     Int16(i16){} 
    my_union(float f): 
     Float(f){} 
    my_union(const string *s): 
     str(s){} 

    short int Int16; float Float; const string *str; 
}; 

int main() 
{ 
    const my_union u1 = (short)5; 
    const my_union u2 = (float)7.; 
    static const string refstr= "asdf"; 
    const my_union u3 = &refstr; 
} 

Es komplizierter Weg zu schaffen Klasse, die zu Union gehört, Klasse muss einen Selektor (Skalar- oder Vektordatentyp verwendet) haben - um String korrekt zu zerstören.

+1

Bitte verwenden Sie keine HTML-Tags, um Ihren Code zu formatieren - wählen Sie einfach den Code mit der Maus aus und tippen Sie Strg-K. –

+1

TROCKEN (nicht wiederholen). "5" ist bereits int und "7." ist schon schwebend. Du brauchst diese fiesen C-Casts nicht. –

+0

dann versuchen, zu unterscheiden const my_union u1 = 0 Das verursacht Eindeutigkeit zwischen Zeiger const string * und short. Aus diesem Grund habe ich für die Übersichtlichkeit nur explizite Modifikatoren verwendet. – Dewfy

2

Einheiten können keine Nicht-POD-Datentypen wie Zeichenfolge enthalten, daher ist Ihre Frage bedeutungslos.

+0

OP geändert, Frage steht noch – Maciek

+0

wenig korrekt: Union kann beliebige Datentypen haben, die nicht Konstruktor oder Destruktor hat. – Dewfy

+0

auch nicht-trivialen Zuweisungsoperator –

3

Ungeachtet das Verbot von nicht-POD Mitgliedsdaten (wie oben ausgeführt) die Norm sagt:

bei 8.5.1.15: Wenn eine Vereinigung mit einem geschweiften Klammern stehenden Initialisierer initialisiert wird, werden die Klammern eines nur enthalten Initialisierer für das erste Mitglied der Union.

so

const my_union u1 = {1}; 

sollte funktionieren, aber diese Form kann nicht für die zweite (und nachfolgende) Mitglieder verwendet werden.

+0

So müssen Sie auswählen, wie Sie es initialisieren möchten und das erste Mitglied machen. –