struct
vereinbart, in der ein union
enthalten ist, dann braucht die union
einen eigenen Namen innerhalb
der struct
, über den ihre Elemente angesprochen werden.
Beispiel: Eine etwas schlicht veranlagte Partnervermittlung möchte ihre Kunden möglichst platzsparend speichern, und möchte bei männlichen und weiblichen Kunden nur das für die erfolgreiche Vermittlung wichtigste Merkmal anlegen. Dies könnte so aussehen:
/* Time-stamp: "31.10.04 09:44 union1c.c klaus@wachtler.de" */ #include <stdio.h> struct kunde { char *vorname, *nachname; union { int koerbchengroesse; double einkommen; } dummy_union; }; int main() { struct kunde frau, mann; frau.dummy_union.koerbchengroesse = 'B'; mann.dummy_union.einkommen = 1500.00; return 0; }
In C++ ist diese Regel gelockert: Man kann den Namen der union
weglassen (anonyme union)
und kann dann die Elemente der union
wie Elemente der struct
ansprechen:
// Time-stamp: "(15.11.01 12:03) union1.cpp [Klaus Wachtler (aw38)]" struct kunde { char *vorname, *nachname; union { int koerbchengroesse; double einkommen; }; }; int main() { kunde frau, mann; frau.koerbchengroesse = 'B'; mann.einkommen = 1500.00; }Das ist in C++ möglich, weil die Elemente der anonymen
union
im selben
Namensraum liegen, wie die der struct
. Dies heißt aber umgekehrt,
daß die Elementnamen eindeutig unterscheidbar sein müssen.
Allerdings ist es nicht möglich, innerhalb der anonymen union
eine
ebenfalls anonyme struct
anzulegen; hier ist dann doch wieder
eine zusätzlicher Name erforderlich:
// Time-stamp: "(15.11.01 12:03) union2.cpp [Klaus Wachtler (aw38)]" enum haarfarbe_e { blond, rot, dunkel }; struct kunde { char *vorname, *nachname; union { struct { int koerbchengroesse; enum haarfarbe_e haarfarbe; } weiblich; double einkommen; }; }; int main() { kunde frau, mann; frau.weiblich.koerbchengroesse = 'B'; frau.weiblich.haarfarbe = blond; mann.einkommen = 1500.00; }