अक्सर, एक साथ कई अलग-अलग प्रकारों की आवश्यकता होती है। कभी-कभी, एक नाम क्लैश होता है। इसके दो समाधान दिमाग में आते हैं: एक नेमस्पेस का उपयोग करें, या 'बड़े' एनम तत्व नामों का उपयोग करें। फिर भी, नामस्थान समाधान के दो संभावित कार्यान्वयन हैं: नेस्टेड एनम या पूर्ण विकसित नामस्थान के साथ एक डमी क्लास।
मैं तीनों दृष्टिकोणों के पेशेवरों और विपक्षों की तलाश कर रहा हूं।
उदाहरण:
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
enum e {...}
, एनम गुमनाम हो सकते हैं, अर्थात enum {...}
, जो नाम या वर्ग में लिपटे होने पर बहुत अधिक समझ में आता है।