2012-09-12 20 views
5

में एनम वैल्यू एक्सेस करें मेरे पास "फू" कक्षा (नीचे) में परिभाषित enum मानों का एक सेट है।सी ++ 98 और सी ++ 11

namespace Fii 
{ 
    class Foo 
    { 
     struct Bar 
     { 
      enum Baz 
      { 
       BAZ1, 
       BAZ2, 
       BAZ3 
      }; 
     }; 
    }; 
}; 

मैं एक struct उपयोग कर रहा हूँ के रूप में अच्छी तरह से बाज enum मूल्यों के दायरे को कम करने के शो के रूप में वहाँ संबंधित मूल्यों का एक समूह है।

मेरा उद्देश्य एक एनम प्रकार से एक चर को एक वैल्यू असाइन करना है। ऊपर वर्ग परिभाषा का उपयोग करना, एक ऐसा कर सकते हैं:

Fii::Foo::Bar::Baz myValue = Fii::Foo::Bar::BAZ1 (Works in both C++98 and C++11) 

हालांकि, मुझे लगता है कि:

  • पहली नज़र में, myValue एक Fii :: फू के रूप में प्रारंभ किया जा रहा है :: बार लेकिन यह है सिर्फ इसलिए कि enum माता पिता (बार इस मामले में)

करने में समूह संबंधित स्थिरांक को हैक कर रहे हैं तत्परता में सुधार, द्वितीय के लिए कोड को फिर से कारक: इस नए वर्ग परिभाषा का उपयोग

namespace Fii 
{ 
    class Foo 
    { 
     enum Baz 
     { 
      BAZ1, 
      BAZ2, 
      BAZ3 
     }; 
    }; 
}; 

, एक ऐसा कर सकते हैं:

Fii::Foo::Baz myValue = Fii::Foo::Baz::BAZ1 (Works in C++11 only) 
Fii::Foo::Baz myValue = Fii::Foo::BAZ1 (Should work on C++98 and C++11 - not tested) 

क्यू 1) क्यों Fii :: फू :: है बार: : बाज़ myValue = Fii :: Foo :: Baz :: BAZ1 केवल C++ 11 पर काम कर रहा है?

Q2) सी ++ 98 में, वहाँ एक रास्ता Fii :: फू :: बाज myValue = Fii :: फू :: बाज :: BAZ1 लिखने के लिए है? कक्षा परिभाषा में आपको कोई भी बदलाव करने की अनुमति है।

पर्यावरण: - Xcode 4 - - मैक ओएस OS 10.8

उत्तर

5

juanchopanza के जवाब के Q1 के लिए मान्य ...

Q2: सी ++ 98 में, वहाँ एक रास्ता Fii :: फू :: बाज myValue = Fii लिखना है :: फू :: बाज़ :: BAZ1? कक्षा परिभाषा में आपको कोई भी बदलाव करने की अनुमति है।

कुछ की तरह:

namespace Fii 
{ 
    class Foo 
    { 
     class Baz 
     { 
      public: 
      enum E { BAZ1, BAZ2, BAZ3 }; 
      Baz(E e) : e_(e) { } 
      operator const E() const { return e_; } 
      private: 
      E e_; 
     }; 
    }; 
} 

स्पष्टीकरण: Fii::Foo::Baz::BAZ1 के लिए में एक गणना के लिए एक वैध संदर्भ होने के लिए सी ++ 03, Baz एक namespace या class/struct/union होना चाहिए। लेकिन, हम ऐसा प्रतीत करने की कोशिश कर रहे हैं जैसे कि बाज खुद ही गणना प्रकार है, बीएजेड 1 उपलब्ध मूल्यों में से एक है। ऐसा करने के लिए, हमें बाज़ को उपयोगकर्ता-परिभाषित-प्रकार (एक वर्ग/संरचना) को अपने दायरे में घोषित समझाई गई किसी भी गणना को संग्रहीत करने में सक्षम होना चाहिए।इसलिए, हम वर्तमान मूल्य को रिकॉर्ड करने के लिए एक डेटा सदस्य जोड़ते हैं, मूल्य निर्धारित करने के लिए एक कन्स्ट्रक्टर, ऑपरेटर मूल्य को स्पष्ट रूप से बेनकाब करने के लिए एक ऑपरेटर ताकि आपको Baz ऑब्जेक्ट्स का उपयोग करके कोड में हर जगह e_ पर स्पष्ट संदर्भों को कोड करने की आवश्यकता न हो या कुछ get() const फ़ंक्शन पर कॉल करें।

+0

क्या आप कृपया बता सकते हैं कि कोड का यह टुकड़ा क्यों आवश्यक है? बाज़ (ई ई): ई_ (ई) {} ऑपरेटर कॉन्स ई() कॉन्स {वापसी ई_; } निजी: ई ई_; –

+0

@ डेविड एंड्रॉलेटि: उपरोक्त कोड में, बाज एक "उपयोगकर्ता परिभाषित प्रकार" है - एक वर्ग जिसका ऑब्जेक्ट प्रत्येक एक 'ई' मान का प्रबंधन करता है। जिस कोड के बाद आप पूछते हैं वह वह कन्स्ट्रक्टर है जो गणनाओं में से एक को संग्रहीत करता है, एक ऑपरेटर जो स्पष्ट रूप से 'ई' मान प्रदान करता है जब ऑब्जेक्ट एक अभिव्यक्ति में प्रकट होता है जहां संकलक को पता नहीं होता कि' बाज 'के साथ क्या करना है, और सदस्य चर 'ई' संग्रहित। स्पष्ट है क्या? - आगे स्पष्टीकरण/उदाहरणों के लिए पूछने के लिए स्वतंत्र महसूस करें .... –

+0

मैंने आपके सुझाव की कोशिश की और यह ठीक काम करता है। क्या आपको लगता है कि यह मदद कोड पठनीयता है और कोड रखरखाव में बाधा नहीं डालता है? –

6

सी ++ 11 class enums कहते सी ++ 11 समर्थन साथ बजना संकलक। यह पुरानी शैली के एनम मूल्यों तक पहुंचने का एक नया तरीका भी जोड़ता है, जो आप यहां देख रहे हैं।

enum Foo { FOO1, FOO2, FOO3 }; // old-style enum 

Foo f1 = Foo::FOO1; // OK in C++11, error in C++98. 
Foo f2 = FOO1; // OK in C++98 and C++11 (for backward compatibility)