2012-04-10 11 views
9

मैं कक्षा है निम्नलिखित की तरह:सी में से मूल्यों Enum को एक्सेस करना '::' ++

class Car 
{ 
public: 
    Car(); 
    // Some functions and members and <b>enums</b> 
    enum Color 
    { 
     Red, 
     Blue, 
     Black 
    }; 
    Color getColor(); 
    void setColor(Color); 
private: 
    Color myColor; 
} 

मैं चाहता हूँ करने के लिए: Color::Red रूप

  1. पहुँच Color को मान। यह कोड को समझने के लिए वास्तव में शायद ही होता है जब Car::Red, प्रयोग किया जाता है जब कक्षा एक बहुत enums है, उपवर्गों आदि
  2. समारोह तर्क या में switch

मैं वापसी मान

  • उपयोग वैरिएबल प्रकार Color रूप में उपयोग के प्रकार Color पता 3 आंशिक समाधान:

    1. यह
    2. में एम्बेडेड वर्ग Color और enum का उपयोग एम्बेडेड nam का उपयोग करना Espace Color और enum यह
    3. में enum class

    1 और 2 समाधान का उपयोग एक Color::Red परिग्रहण समस्या का हल है, लेकिन मैं Color getColor() और void setColor(Color) जैसे कार्यों का उपयोग नहीं कर सकते हैं।

    3 समाधान में कोई समस्या है: VS2010 enum class का समर्थन नहीं करता है। जीसीसी v.4.1.2 भी इसका समर्थन नहीं करता है। मैं जीसीसी के बाद के संस्करणों के बारे में नहीं जानता।

    हां, मैं क्रॉस-प्लेटफ़ॉर्म प्रोजेक्ट पर काम कर रहा हूं।
    मुझे this समाधान मिला है, लेकिन ऐसा लगता है ... भारी।
    मुझे आशा है कि किसी ने मुझसे यहाँ मदद कर सकते हैं :)

  • +2

    जीसीसी 4।6 ('-std = C++ 0x' के साथ) 'enum class' का समर्थन करता है, और नियमित enums के लिए' रंग :: लाल 'भी अनुमति देता है। – leftaroundabout

    +0

    साइड नोट, कृपया पूर्व/कोड टैग – CharlesB

    +0

    का उपयोग करने के बजाय 4 रिक्त स्थान के साथ इंडेंट कोड कृपया VS2010 से मिले ** ** आंशिक रूप से ** [मजबूत टाइप किए गए enums] का समर्थन है (http://www.open-std.org/jtc1/ sc22/wg21/docs/कागजात/2007/n2347.pdf)। – Jury

    उत्तर

    13

    वर्तमान C++ (यानी सी ++ 11 और आगे), आप पहले से ही enum मूल्यों की तरह उपयोग कर सकते हैं:

    enum Color { Red }; 
    Color c = Color::Red; 
    Color d = Red; 
    

    आप आगे जाना है और इस का उपयोग नहीं मजबूर कर सकते हैं समझना:

    enum class Color { Red }; 
    Color c = Color::Red; 
    // Color d = Red; <-- error now 
    

    और एक sidenote पर, अब आप अंतर्निहित प्रकार है, जो पहले hacky कोड के साथ ही संभव था परिभाषित करते हैं (FORCEDWORD या तो किसी को?):

    enum class Color : char { Red }; 
    
    +0

    आप सही हैं, लेकिन पूर्ण समर्थन C++ 11 सुविधाओं वाले कोई कंपाइलर नहीं हैं। हां, जीसीसी 4.6 और 4.7 इसका समर्थन करते हैं, लेकिन मेरी परियोजना विंडोज़ के लिए भी संकलित की जानी चाहिए। वीएस -2010 इसका समर्थन नहीं करता है। क्या आप इसके लिए कुछ पैच जान सकते हैं? – Jury

    +0

    आप मिनजीडब्ल्यू को आजमा सकते हैं, जो कि जीसीसी का विंडोज पोर्ट है। एमएसवीसी बंद स्रोत है और कोई पैच नहीं है। –

    7

    नाम नेस्टेड वर्ग के अंदर enum (उदाहरण के रूप में):

    class Car 
    { 
    public: 
        struct Color 
        { 
         enum Type 
         { 
          Red, 
          Blue, 
          Black 
         }; 
        }; 
    
        Color::Type getColor(); 
        void setColor(Color::Type); 
    }; 
    
    +1

    आप 'सी ++ 11' फीचर 'एनम क्लास' के बारे में भी उल्लेख कर सकते हैं। – iammilind

    +0

    और 'कार' के गेटर और सेटटर में 'रंग' के गेटर और सेटर का उपयोग करें? – Jury

    +0

    'रंग ::' भाग की आवश्यकता नहीं है? – Konrad

    5

    जब मैं इस तरह कुछ करना चाहता हूँ मैं एक नाम स्थान का उपयोग करते हैं और नामस्थान के बाहर एक टाइपिफ़ (हालांकि आमतौर पर मैं कक्षा के अंदर विश्व स्तर पर यह कर रहा हूं)। कुछ इस तरह:

    namespace colors 
    { 
        enum Color 
        { 
         Red, 
         Blue 
         ... 
        } 
    } 
    typedef colors::Color Color; 
    

    इस तरह आप नाम स्थान का उपयोग वास्तविक रंग में प्राप्त करने के लिए, लेकिन Color प्रकार ही अभी भी विश्व स्तर पर पहुँचा जा सकता है:

    Color myFav = colors::Red; 
    
    +0

    वीएस -2010: त्रुटि सी 2059: वाक्यविन्यास त्रुटि: 'नेमस्पेस' | जीसीसी 4.1.2: त्रुटि: 'नेमस्पेस' – Jury

    +0

    @Jury से पहले अपेक्षित अयोग्य-आईडी अपेक्षित है क्योंकि आपको कक्षाओं के अंदर नामस्थान घोषित करने की अनुमति नहीं है। जैसे मैंने कहा, मैं आमतौर पर यह वैश्विक रूप से करता हूं। यदि आप वास्तव में इसे कक्षा में रखना चाहते हैं तो आप हमेशा एक नेस्टेड क्लास का उपयोग कर सकते हैं - सिद्धांत सिद्धांत वही है। – obmarg

    +0

    टाइपपीफ वास्तव में जरूरी नहीं है, और मैं रंग को नामस्थान नाम के रूप में रखूंगा और enum को नाम नहीं दूंगा। मैं नामस्थान विधि का उपयोग हर समय से बहुत ही सुरुचिपूर्ण है। यहां enums का उपयोग करने के बारे में कुछ और जानकारी दी गई है: http://inphamousdevelopment.wordpress.com/2012/04/02/enumeration-and-arrays/ – alex

    संबंधित मुद्दे