Δομές και ενώσεις
Η δήλωση μιας δομής στη C++ με τη μορφή:
struct s { ...
είναι μια συντομογραφία για τη δήλωση:
class s {public: ...
δηλαδή για μια κλάση της οποίας όλα τα μέλη είναι δημόσια.
Αντίστοιχα η δήλωση μιας ένωσης (union) επιτρέπει
τη χρήση του ίδιου χώρου από όλα τα μέλη της ένωσης.
Η C++ επιτρέπει τον ορισμό συναρτήσεων κατασκευής ως μέλη της ένωσης.
Με τη χρήση πολυμορφικών συναρτήσεων κατασκευής μπορεί κανείς να
αποδώσει αρχική τιμή σε οποιοδήποτε μέλος της ένωσης κατά την
αρχικοποίησή του.
Παράδειγμα:
union token {
char c;
int i;
double d;
token(char sc) {c = sc;}
token(int si) {i = si;}
token(double sd) {d = sd;}
};
void
f()
{
token a = 3.14; // Assign value to a.d
token b = 't'; // Assign value to b.c
}
Σε περίπτωση που θέλουμε να αποφύγουμε λάθη με την ανάθεση σε ένα
μέλος ενός τύπου και την ανάκτηση από ένα μέλος άλλου τύπου μπορούμε
να εμφωλιάσουμε την ένωση σε μια κλάση:
class token {
private:
enum e_type {CHAR, INT, DOUBLE} type;
union {
char c;
int i;
double d;
};
void check(e_type t) {if (type != t) error();}
public:
token(char sc) {c = sc; type = CHAR;}
token(int si) {i = si;} type = INT;}
token(double sd) {d = sd;} type = DOUBLE;}
int &cval() {check(CHAR); return c;}
int &ival() {check(INT); return i;}
int &dval() {check(DOUBLE); return d;}
token(char sc) {c = sc;}
token(int si) {i = si;}
token(double sd) {d = sd;}
};
void
f()
{
token a = 3.14; // Assign value to a.d
printf("%g\n", a.dval()); // Ok
printf("%d\n", a.ival()); // Check will fail
}