Unions are used to minimize memory waste. For example, consider the following database-transaction class used to update a person's data. The key can be either a unique ID number or a person's last name, but never both at once:
class UpdateDetails {
private:
enum keytype{ keystring, keyID} key;
char *name;
long ID;
//...
UpdateDetails(const char *n): key(keystring),
n (new char [strlen)n) +1]
{strcpy(name,n);}
UpdatePersonalDetails(long id) : ID(id), key(keyID) {}
};
Clearly, memory is wasted here since only one of the keys can be used in each transaction. An
anonymous union (for instance, an embedded union having neither a tag-name nor an instance name) can be used in this case to avoid memory waste:
class UpdateDetails {
enum keytype{ keystring, keyID} key;
union { //anonymous union: 1. has no tag name,
char *name;
long ID
}; // 2. and no instance name.
public:
UpdateDetails(const char *n) : key (keystring),
n (new char [strlen(n) +1]
{strcpy(name, n);}
UpdateDetails(long id) : ID(id), key(keyID) {};
//...
};
The advantage over an ordinary union is that in this case, the members of an anonymous union are accessed directly:
void UpdateDetails::GetID() const
{
if (key == keyID)
return ID;//anonymous union member, accessed like ordinary member
return 0L; //indicate string key is used
}