अंतिम अद्यतन:2026-10-12
C++ enum टाइप¶
लेखक के बारे में:¶
व्यक्तिगत 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;
}
विस्तृत implementation देखें: tradition_color.cpp
क्लासिक तरीका¶
स्कोप सीमित न होने से उत्पन्न naming conflict समस्या का एक सरल हल है, enum वेरिएबल को नाम देते समय prefix लगाना, जैसे ऊपर के उदाहरण को COLOR_BLUE और FEELING_BLUE कर देना।
आमतौर पर, consistency के लिए हम सभी constants पर prefix लगा देते हैं। लेकिन इस तरह enum वेरिएबल परिभाषित करने वाला कोड भारी लगता है। C प्रोग्राम में शायद ऐसा करना पड़े। लेकिन C++ प्रोग्रामर शायद इस तरीके को पसंद नहीं करते। विकल्प है namespace:
इसके बाद Color::Type c = Color::RED; से नए enum वेरिएबल परिभाषित किए जा सकते हैं। अगर using namespace Color करें, तो prefix हटाया जा सकता है, जिससे कोड सरल होता है। हालाँकि, क्योंकि namespace में बाद में सामग्री जोड़ी जा सकती है, इसलिए इसका स्कोप enclosure कमज़ोर है। बड़े प्रोजेक्ट में अलग-अलग लोगों के अलग-अलग चीज़ों को एक जैसा enum टाइप नाम देने की संभावना बनी रहती है।
और "असरदार" तरीका है किसी क्लास या स्ट्रक्चर से उसका स्कोप सीमित करना, जैसे: नया वेरिएबल परिभाषित करने का तरीका ऊपर वाले namespace जैसा ही है। लेकिन इस तरह क्लास के कहीं और से बदले जाने की चिंता नहीं रहती। यहाँ क्लास की जगह स्ट्रक्चर इसलिए उपयोग किया, क्योंकि चाहा जाता है कि ये constants सार्वजनिक रूप से एक्सेस हो सकें।
विस्तृत 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 स्टैंडर्ड से पहले)
सही तरीका है क्लास के कंस्ट्रक्टर की 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 दर्शा नहीं सकता।
संबंधित विषय¶
- C++ प्योर वर्चुअल फ़ंक्शन और एब्स्ट्रैक्ट क्लास | C++那些事
- C++ assert | C++那些事
- C++ bit-field | C++那些事
- C भाषा से C++ पॉलीमॉर्फ़िज़्म | C++那些事
- C++ const constant और qualifier | C++那些事
- C++ const परिवार | C++那些事
- C++ dereference ऑपरेटर * | C++那些事
- C++ इनिशियलाइज़ेशन और असाइनमेंट | C++那些事
- C++ multiple return values लिखने के तरीके | C++那些事
- C++ mutable कीवर्ड | C++那些事