2012-06-03 11 views
12

Enums ++ एक प्रमुख समस्या है: आप इस तरह दो अलग enums में एक नाम नहीं हो सकता:सी ++ में समान नाम के साथ दो enum मानों के लिए नाम विवादों से कैसे बचें? सी में

enum Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 

तो सबसे अच्छा तरीका है इस उदाहरण में इस मुद्दे को संभालने के लिए क्या है?

+1

यदि enum कक्षा के लिए विशिष्ट है, तो इसे कक्षा के (सार्वजनिक अनुभाग) के अंदर रखें, फिर तत्वों को देखें। कक्षा नाम :: कोई नहीं और अन्य क्लासनाम :: कोई नहीं। आप इसके बजाय नामस्थानों में enums भी डाल सकते हैं। शुद्ध सी में उन्हें नाम देने का सामान्य तरीका प्रत्येक गणित पहचानकर्ता को उपसर्ग के माध्यम से है। – pmdj

+0

मेरा प्रश्न http://stackoverflow.com/questions/12972317/count-on-enum-c- स्वचालित आपके प्रश्न का उत्तर देता है। सी ++ 11 में – sergiol

+0

enum कक्षाएं एक अच्छा प्रयास प्रतीत होती हैं। लेकिन आपको इसे लागू करने के बाद इसे डालना होगा। – bytecode77

उत्तर

27

सी ++ 03 में आप अंदर enum संलग्न कर सकते हैं एक struct:

struct Browser 
{ 
    enum eBrowser 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    }; 
}; 

सी ++ 11 में यह एक enum class करें:

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
}; 

सी ++ 03 namespace एलएस में ओ लपेटा जा सकता है, लेकिन व्यक्तिगत रूप से मुझे struct/class रैपिंग मिलती है क्योंकि namespace अधिक व्यापक है। जैसे

// file1.h 
namespace X 
{ 
    enum E { OK }; 
} 

// file2.h 
namespace X 
{ 
    enum D { OK }; 
} 
+0

क्यों 'स्ट्रक्चर' और 'नेमस्पेस' नहीं? – Pubby

+1

@ पब्बी, 'नेमस्पेस' भी ठीक है, लेकिन मुझे 'एन्हम क्लास' के साथ 'संरचना'/'वर्ग' "दार्शनिक रूप से" अधिक संगत लगता है। – iammilind

+4

@ पब्बी: आप 'संरचना' पर टेम्पलेट विशेषज्ञ कर सकते हैं। –

3

या तो उन्हें नामस्थान में या कक्षाओं में लपेट:

namespace Browser { 
    enum BrowserType 
    { 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
    } 
} 

namespace OS { 
    enum OSType { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 
12

एक विकल्प एक अलग नाम स्थान में प्रत्येक enum डाल करने के लिए है:

namespace Foo { 
    enum Browser { 
     None = 0, 
     Chrome = 1, 
     Firefox = 2 
    } 
} 

namespace Bar { 
    enum OS { 
     None = 0, 
     XP = 1, 
     Windows7 = 2 
    } 
} 

एक बेहतर विकल्प अपने संकलक के साथ उपलब्ध है, उपयोग करने के लिए है सी ++ 11 enum classes:

enum class Browser { ... } 
enum class OS { ... } 

enum कक्षाओं पर चर्चा के लिए here देखें।

1

स्कॉप्ड बनाम unscoped गणना का उपयोग करने के बारे में कैसे? सी ++ 11 अब स्कोप्ड गणना प्रदान करता है। एक उदाहरण: ब्राउज़र की एक वस्तु या ओएस की एक वस्तु के माध्यम से

enum class Browser : <type> { 

}; 

enum class OS : <type> { 

}; 

पहुँच प्रगणित प्रकार के।

2

आप enum class (scoped enums) का उपयोग कर सकते हैं जो C++ 11 में समर्थित है। यह दृढ़ता से टाइप किया गया है और इंगित करता है कि प्रत्येक enum प्रकार अलग है।

Browser::None != OS::None 

enum class Browser 
{ 
    None = 0, 
    Chrome = 1, 
    Firefox = 2 
} 

enum class OS 
{ 
    None = 0, 
    XP = 1, 
    Windows7 = 2 
} 
संबंधित मुद्दे