खोज…
मूल गणना घोषणा
मानक गणनाएं उपयोगकर्ताओं को पूर्णांकों के सेट के लिए एक उपयोगी नाम घोषित करने की अनुमति देती हैं। नामों को सामूहिक रूप से प्रगणक के रूप में जाना जाता है। एक एन्यूमरेशन और उससे जुड़े एन्यूमरेटर्स को निम्नानुसार परिभाषित किया गया है:
enum myEnum
{
enumName1,
enumName2,
};
एक गणना एक प्रकार है , जो अन्य सभी प्रकारों से अलग है। इस मामले में, इस प्रकार का नाम myEnum
। इस प्रकार की वस्तुओं से गणना के भीतर एक एन्यूमरेटर के मूल्य को मानने की उम्मीद की जाती है।
प्रगणक के भीतर घोषित किए गए प्रगणक गणना के प्रकार के निरंतर मान हैं। हालांकि एनुमरेटर्स प्रकार के भीतर घोषित किए जाते हैं, लेकिन गुंजाइश ऑपरेटर ::
नाम तक पहुंचने के लिए आवश्यक नहीं है। तो पहले एन्यूमरेटर का नाम enumName1
।
गुंजाइश ऑपरेटर वैकल्पिक रूप से एक गणना के भीतर एक एन्यूमरेटर तक पहुंचने के लिए उपयोग किया जा सकता है। तो enumName1
को भी enumName1
जा सकता है myEnum::enumName1
।
Enumerators को पूर्णांक मान दिए गए हैं जो 0 से शुरू हो रहा है और एक गणना में प्रत्येक एन्यूमरेटर के लिए 1 से बढ़ रहा है। तो उपरोक्त मामले में, enumName1
का मान 0 है, जबकि enumName2
का मान 1 है।
Enumerators को उपयोगकर्ता द्वारा एक विशिष्ट मूल्य भी सौंपा जा सकता है; यह मान एक अभिन्न स्थिर अभिव्यक्ति होना चाहिए। ऐसे एन्यूमरेटर जिनके मूल्य स्पष्ट रूप से प्रदान नहीं किए गए हैं, उनका मान पिछले एन्यूमरेटर + 1 के मान पर सेट होगा।
enum myEnum
{
enumName1 = 1, // value will be 1
enumName2 = 2, // value will be 2
enumName3, // value will be 3, previous value + 1
enumName4 = 7, // value will be 7
enumName5, // value will be 8
enumName6 = 5, // value will be 5, legal to go backwards
enumName7 = 3, // value will be 3, legal to reuse numbers
enumName8 = enumName4 + 2, // value will be 9, legal to take prior enums and adjust them
};
स्विच स्टेटमेंट में गणना
प्रगणकों के लिए एक सामान्य उपयोग स्विच स्टेटमेंट के लिए है और इसलिए वे आमतौर पर राज्य मशीनों में दिखाई देते हैं। वास्तव में गणना के साथ स्विच स्टेटमेंट की एक उपयोगी विशेषता यह है कि यदि स्विच के लिए कोई डिफ़ॉल्ट स्टेटमेंट शामिल नहीं है, और एनम के सभी मूल्यों का उपयोग नहीं किया गया है, तो कंपाइलर एक चेतावनी जारी करेगा।
enum State {
start,
middle,
end
};
...
switch(myState) {
case start:
...
case middle:
...
} // warning: enumeration value 'end' not handled in switch [-Wswitch]
एक एनम पर Iteration
एन्यूमरेशन को लेकर कोई अंतर्निहित नहीं है।
लेकिन कई तरीके हैं
केवल निरंतर मूल्यों वाले
enum
लिए:enum E { Begin, E1 = Begin, E2, // .. En, End }; for (E e = E::Begin; e != E::End; ++e) { // Do job with e }
enum class
साथ, operator ++
को लागू करना होगा:
E& operator ++ (E& e)
{
if (e == E::End) {
throw std::out_of_range("for E& operator ++ (E&)");
}
e = E(static_cast<std::underlying_type<E>::type>(e) + 1);
return e;
}
std::vector
रूप में एक कंटेनर का उपयोग करनाenum E { E1 = 4, E2 = 8, // .. En }; std::vector<E> build_all_E() { const E all[] = {E1, E2, /*..*/ En}; return std::vector<E>(all, all + sizeof(all) / sizeof(E)); } std::vector<E> all_E = build_all_E();
और फिर
for (std::vector<E>::const_iterator it = all_E.begin(); it != all_E.end(); ++it) { E e = *it; // Do job with e; }
या
std::initializer_list
और एक सरल वाक्यविन्यास:enum E { E1 = 4, E2 = 8, // .. En }; constexpr std::initializer_list<E> all_E = {E1, E2, /*..*/ En};
और फिर
for (auto e : all_E) { // Do job with e }
बंद हो गई दुश्मनी
C ++ 11 यह दर्शाता है कि स्कोप्ड एनम के रूप में क्या जाना जाता है। ये ऐसे एन्यूमरेशन हैं जिनके सदस्यों को enumname::membername
साथ योग्य होना चाहिए enumname::membername
। एनोप enum class
सिंटैक्स का उपयोग करके स्कोप किए गए एनम को घोषित किया जाता है। उदाहरण के लिए, इंद्रधनुष में रंगों को संग्रहीत करने के लिए:
enum class rainbow {
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
INDIGO,
VIOLET
};
विशिष्ट रंग तक पहुँचने के लिए:
rainbow r = rainbow::INDIGO;
enum class
es को बिना किसी कलाकार के int
s में परिवर्तित किया जा सकता है। तो int x = rainbow::RED
अमान्य है।
स्कूप्ड एनम भी आपको अंतर्निहित प्रकार को निर्दिष्ट करने की अनुमति देता है, जो कि किसी सदस्य का प्रतिनिधित्व करने के लिए उपयोग किया जाने वाला प्रकार है। डिफ़ॉल्ट रूप से यह int
। टिक-टैक-टो खेल में, आप इस टुकड़े को स्टोर कर सकते हैं
enum class piece : char {
EMPTY = '\0',
X = 'X',
O = 'O',
};
जैसा कि आप देख सकते हैं, enum
एस अंतिम सदस्य के बाद एक अल्पविराम अल्पविराम हो सकता है।
C ++ 11 में आगे की घोषणा की
बंद गणना:
...
enum class Status; // Forward declaration
Status doWork(); // Use the forward declaration
...
enum class Status { Invalid, Success, Fail };
Status doWork() // Full declaration required for implementation
{
return Status::Success;
}
अघोषित गणनाएँ:
...
enum Status: int; // Forward declaration, explicit type required
Status doWork(); // Use the forward declaration
...
enum Status: int{ Invalid=0, Success, Fail }; // Must match forward declare type
static_assert( Success == 1 );
एक इन-डेप्थ मल्टी-फाइल उदाहरण यहां पाया जा सकता है: ब्लाइंड फ्रूट मर्चेंट उदाहरण