विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ enum class स्ट्रॉन्ग टाइप्ड एनम

Effective modern C++ के Item 10: Prefer scoped enums to unscoped enum में कहा गया है कि बिना स्कोप वाले enum के स्थान पर स्कोप वाले enum class का उपयोग करें।

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

enum Shape {circle,retangle};
auto circle = 10;  // error

उपरोक्त त्रुटि इसलिए है क्योंकि दोनों circle एक ही स्कोप में हैं। enum के लिए यह निम्न के तुल्य है:

#define circle 0
#define retangle 1
इसलिए बाद में circle को फिर से परिभाषित करने पर त्रुटि होगी।

अतः चाहे enum का नाम जो भी हो, यदि उनके भीतर के मेंबरों में कोई नाम समान है, तो समस्या आएगी। उदाहरण के लिए:

enum A {a,b};
enum B {c,a};
a दो बार आया है, enum B के a वाले स्थान पर त्रुटि रिपोर्ट होती है।

पहले की चर्चा से हम जानते हैं कि enum का नाम स्कोप की दृष्टि से कोई विशेष भूमिका नहीं निभाता, इसलिए हमें namespace का विचार आया, जैसा नीचे के उदाहरण में है:

// 在创建枚举时,将它们放在名称空间中,以便可以使用有意义的名称访问它们:
namespace EntityType {
    enum Enum {
        Ground = 0,
        Human,
        Aerial,
        Total
    };
}

void foo(EntityType::Enum entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
नेमस्पेस का नाम थोड़ा सार्थक रखने पर, वांछित प्रभाव प्राप्त किया जा सकता है।

लेकिन लगातार नेमस्पेस का उपयोग करना अनिवार्यतः बहुत कठिन हो जाता है, और यदि मैं namespace का उपयोग न करूँ और फिर भी ऐसा प्रभाव पाना चाहूँ, तो यह असुरक्षित हो जाता है तथा कोई बाध्यता (constraint) भी नहीं रहती।

इसीलिए c++11 के बाद enum class पेश किया गया।

enum class, enum मेंबरों के लिए टाइप परिभाषित करने, टाइप सुरक्षा तथा बाध्यता (constraint) जैसी समस्याओं को हल करता है। उपरोक्त उदाहरण पर लौटते हैं:

// enum class
enum class EntityType {
    Ground = 0,
    Human,
    Aerial,
    Total
};

void foo(EntityType entityType)
{
    if (entityType == EntityType::Ground) {
        /*code*/
    }
}
यही वह इडियम है जिसे यह अनुभाग समझाना चाहता है: enum class।

संबंधित विषय

टिप्पणियाँ