Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: All
Apr 16, 1998

Uses of an anonymous union

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 
}
Danny Kalev
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap