c++ - सादा enum पर enum वर्ग क्यों पसंद किया जाता है?




class enums (3)

मैंने कुछ लोगों को उनकी प्रकार की सुरक्षा के कारण सी ++ में एनम कक्षाओं का उपयोग करने की सिफारिश की।

लेकिन असल में उसका क्या अर्थ है?


पूर्णांक मानों के सेट का प्रतिनिधित्व करने के लिए गणना का उपयोग किया जाता है।

enum बाद class कीवर्ड निर्दिष्ट करता है कि गणना दृढ़ता से टाइप की जाती है और इसके गणक स्कॉप्ड होते हैं। इस तरह enum वर्ग स्थिरांक के आकस्मिक दुरुपयोग से बचाता है।

उदाहरण के लिए:

enum class Animal{Dog, Cat, Tiger};
enum class Pets{Dog, Parrot};

यहां हम पशु और पालतू जानवरों के मूल्यों को मिश्रण नहीं कर सकते हैं।

Animal a = Dog;       // Error: which DOG?    
Animal a = Pets::Dog  // Pets::Dog is not an Animal

सामान्य enums पर enum वर्ग का उपयोग करने का मूल लाभ यह है कि आपके पास 2 अलग-अलग enums के लिए समान enum चर हो सकता है और अभी भी उन्हें हल कर सकते हैं (जिसे ओपी द्वारा सुरक्षित प्रकार के रूप में वर्णित किया गया है)

उदाहरण के लिए:

enum class Color1 { red, green, blue };    //this will compile
enum class Color2 { red, green, blue };

enum Color1 { red, green, blue };    //this will not compile 
enum Color2 { red, green, blue };

मूलभूत enums के लिए, संकलक इस बात को अलग करने में सक्षम नहीं होगा कि red Color1 या Color2 रूप में रेफर कर रहा है जैसा कि नीचे दिए गए कथन में है।

enum Color1 { red, green, blue };   
enum Color2 { red, green, blue };
int x = red;    //Compile time error(which red are you refering to??)

सी ++ में दो प्रकार के enum :

  1. enum class es
  2. सादा enum एस

यहां कुछ उदाहरण दिए गए हैं कि उन्हें कैसे घोषित किया जाए:

 enum class Color { red, green, blue }; // enum class
 enum Animal { dog, cat, bird, human }; // plain enum 

दो के बीच क्या अंतर है?

  • enum class es - enumerator नाम enum के लिए स्थानीय हैं और उनके मूल्य निश्चित रूप से अन्य प्रकारों में परिवर्तित नहीं होते हैं (जैसे किसी अन्य enum या int )

  • सादा enum एस - जहां गणनाकर्ता नाम एक ही दायरे में हैं क्योंकि enum और उनके मूल्य अंतर्निहित रूप से पूर्णांक और अन्य प्रकार में परिवर्तित

उदाहरण:

enum Color { red, green, blue };                    // plain enum 
enum Card { red_card, green_card, yellow_card };    // another plain enum 
enum class Animal { dog, deer, cat, bird, human };  // enum class
enum class Mammal { kangaroo, deer, human };        // another enum class

void fun() {

    // examples of bad use of plain enums:
    Color color = Color::red;
    Card card = Card::green_card;

    int num = color;    // no problem

    if (color == Card::red_card) // no problem (bad)
        cout << "bad" << endl;

    if (card == Color::green)   // no problem (bad)
        cout << "bad" << endl;

    // examples of good use of enum classes (safe)
    Animal a = Animal::deer;
    Mammal m = Mammal::deer;

    int num2 = a;   // error
    if (m == a)         // error (good)
        cout << "bad" << endl;

    if (a == Mammal::deer) // error (good)
        cout << "bad" << endl;

}

निष्कर्ष:

enum class es को प्राथमिकता दी जानी चाहिए क्योंकि वे कम आश्चर्य की वजह से संभावित रूप से बग का नेतृत्व कर सकते हैं।







c++-faq