विषय पर बढ़ें

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

C++ enum टाइप

लेखक के बारे में:

व्यक्तिगत WeChat सार्वजनिक अकाउंट:

wechat

पारंपरिक व्यवहार

enum की निम्नलिखित समस्याएँ हैं:

  • स्कोप सीमित नहीं होता, naming conflict पैदा होने की संभावना रहती है। उदाहरण के लिए नीचे का कोड compile नहीं होता:

enum Color
{
    RED,
    BLUE
};
enum Feeling
{
    EXCITED,
    BLUE
};

int main()
{
    Color a = BLUE; // error
    Feeling b = EXCITED;
    std::cout << a << ":" << b << std::endl;
    return 0;
}
- implicitly int में convert हो जाता है - enum वेरिएबल के वास्तविक टाइप को स्पष्ट रूप से निर्दिष्ट नहीं किया जा सकता, जिससे enum टाइप के forward declaration का समर्थन नहीं मिलता।

विस्तृत implementation देखें: tradition_color.cpp

क्लासिक तरीका

स्कोप सीमित न होने से उत्पन्न naming conflict समस्या का एक सरल हल है, enum वेरिएबल को नाम देते समय prefix लगाना, जैसे ऊपर के उदाहरण को COLOR_BLUE और FEELING_BLUE कर देना।

आमतौर पर, consistency के लिए हम सभी constants पर prefix लगा देते हैं। लेकिन इस तरह enum वेरिएबल परिभाषित करने वाला कोड भारी लगता है। C प्रोग्राम में शायद ऐसा करना पड़े। लेकिन C++ प्रोग्रामर शायद इस तरीके को पसंद नहीं करते। विकल्प है namespace:

namespace Color 
{
    enum Type
    {
        RED=15,
        YELLOW,
        BLUE
    };
};

इसके बाद Color::Type c = Color::RED; से नए enum वेरिएबल परिभाषित किए जा सकते हैं। अगर using namespace Color करें, तो prefix हटाया जा सकता है, जिससे कोड सरल होता है। हालाँकि, क्योंकि namespace में बाद में सामग्री जोड़ी जा सकती है, इसलिए इसका स्कोप enclosure कमज़ोर है। बड़े प्रोजेक्ट में अलग-अलग लोगों के अलग-अलग चीज़ों को एक जैसा enum टाइप नाम देने की संभावना बनी रहती है।

और "असरदार" तरीका है किसी क्लास या स्ट्रक्चर से उसका स्कोप सीमित करना, जैसे: नया वेरिएबल परिभाषित करने का तरीका ऊपर वाले namespace जैसा ही है। लेकिन इस तरह क्लास के कहीं और से बदले जाने की चिंता नहीं रहती। यहाँ क्लास की जगह स्ट्रक्चर इसलिए उपयोग किया, क्योंकि चाहा जाता है कि ये constants सार्वजनिक रूप से एक्सेस हो सकें।

struct Color1
{
    enum Type
    {
        RED=102,
        YELLOW,
        BLUE
    };
};

विस्तृत implementation देखें: classic_practice.cpp

C++11 की enum class

ऊपर का तरीका पहली समस्या हल करता है, लेकिन बाकी दो पर असहाय है। शुक्र है कि C++11 स्टैंडर्ड में "enum class" लाया गया, जो उपरोक्त समस्याओं को अच्छी तरह हल करता है।

  • नए enum का स्कोप अब ग्लोबल नहीं है
  • दूसरे टाइप में implicitly convert नहीं होता
/**
 * @brief C++11的枚举类
 * 下面等价于enum class Color2:int
 */
enum class Color2
{
    RED=2,
    YELLOW,
    BLUE
};
Color2 c2 = Color2::RED;
cout << static_cast<int>(c2) << endl; //必须转!
  • enum को स्टोर करने के लिए खास टाइप निर्दिष्ट किया जा सकता है
enum class Color3:char;  // 前向声明

// 定义
enum class Color3:char 
{
    RED='r',
    BLUE
};
char c3 = static_cast<char>(Color3::RED);

विस्तृत implementation देखें: classic_practice.cpp

क्लास में enum टाइप

कभी-कभी हम चाहते हैं कि कुछ constants केवल क्लास में मान्य हों। #define से परिभाषित macro constants ग्लोबल होते हैं, मक़सद हासिल नहीं होता, तो const से qualify किए डेटा मेंबर का उपयोग करने का ख़याल आता है। और const डेटा मेंबर सचमुच मौजूद होते हैं, लेकिन उनका अर्थ वह नहीं होता जो हम चाहते हैं।

const डेटा मेंबर केवल किसी एक ऑब्जेक्ट के जीवनकाल में constant होते हैं, पूरी क्लास के लिए नहीं, क्योंकि क्लास कई ऑब्जेक्ट बना सकती है, अलग-अलग ऑब्जेक्ट के const डेटा मेंबर की वैल्यू अलग हो सकती है।

क्लास declaration में const डेटा मेंबर initialize नहीं किया जा सकता। निम्नलिखित उपयोग ग़लत है, क्योंकि क्लास का ऑब्जेक्ट न बनने पर कंपाइलर नहीं जानता कि SIZE की वैल्यू क्या है। (c++11 स्टैंडर्ड से पहले)

class A 
{
  const int SIZE = 100;   // 错误,企图在类声明中初始化 const 数据成员 
  int array[SIZE];  // 错误,未知的 SIZE 
}; 

सही तरीका है क्लास के कंस्ट्रक्टर की initializer list में करना:

class A 
{
  A(int size);  // 构造函数 
  const int SIZE ;    
}; 
A::A(int size) : SIZE(size)  // 构造函数的定义
{ 

} 
A  a(100); // 对象 a 的 SIZE 值为 100 
A  b(200); // 对象 b 的 SIZE 值为 200 

पूरी क्लास में स्थिर constant कैसे बनाएँ?

const डेटा मेंबर पर भरोसा मत करें, क्लास में enum constant से इसे हासिल करना चाहिए। उदाहरण के लिए:

class Person{
public:
    typedef enum {
        BOY = 0,
        GIRL
    }SexType;
};
//访问的时候通过,Person::BOY或者Person::GIRL来进行访问。

enum constant ऑब्जेक्ट का storage space नहीं घेरते, वे compile time पर सभी का मूल्यांकन हो जाता है।

enum constant की कमी है: इसका implicit डेटा टाइप integer है, इसकी अधिकतम वैल्यू सीमित है, और floating point दर्शा नहीं सकता।

संबंधित विषय

टिप्पणियाँ