2010-02-10 13 views
16

के आगे घोषणा मैं निम्न के समान कोड है:नेस्टेड enum

class B 
{ 
} 

class A 
{ 
    enum { 
    EOne, 
    ETwo 
    } EMyEnum; 

    B myB; 
} 

मैं कक्षा बी में प्रकार EMyEnum (जो एक से पहले घोषित किया जाता है) के एक सदस्य घोषित करने के लिए चाहते हैं। क्या यह संभव है? मुझे एहसास है कि समाधान कक्षा बी दूसरे घोषित करना है, लेकिन स्पष्टता के लिए मैं नहीं करना चाहूंगा।

+0

सुपरसेट http://stackoverflow.com/questions/951234/forward-declaration-of-nested-types-classes-in-c –

उत्तर

11

यह संभव नहीं है ... लेकिन यह विरासत दुरुपयोग :)

namespace detail 
{ 
    class A_EMyEnum 
    { 
    public: 
    enum { 
     EOne, 
     ETwo 
    } EMyEnum; 

    protected: 
    A_EMyEnum() {} 
    A_EMyEnum(const A_EMyEnum&) {} 
    A_EMyEnum& operator=(const A_EMyEnum&) { return *this; } 
    ~A_EMyEnum() {} 
    }; // class A_EMyEnum 
} // namespace detail 

class B { // use detail::A_EMyEnum }; 

class A: public detail::A_EMyEnum 
{ 

    B mB; 
}; 

दूसरी ओर के साथ नाटक किया जा सकता है ... क्यों आप बस आगे बी की घोषणा नहीं करते हैं?

class B; 

class A 
{ 
public: 
    enum EMyEnum {}; 

    A(); 
    A(const A&); 
    A& operator=(const A&); 
    ~A(); 
    void swap(A&); 

private: 
    B* mB; 
}; 

class B { // use A::EMyEnum }; 

निश्चित रूप से आपको वास्तव में ए के सभी सामान्य "डिफ़ॉल्ट जेनरेट" विधियों को लिखने की ज़रूरत है, लेकिन हे, इसका इतना खर्च नहीं होता है!

+1

हाँ पर डाला जा सकता है, उत्तरार्द्ध मैं जो कर रहा था वह था। यह पुष्टि करने के लिए जरूरी है कि मेरी वरीयता संभव नहीं थी :) –

+0

'enum {} EMyEnum' का क्या अर्थ है? मैं पहले कभी नहीं आया है? – Olumide

+0

@ ओलुमाइड: इसमें सी से पहले दो अजीब नाइट्स विरासत में शामिल हैं, सी में, आप तुरंत 'संरचना' या 'enum' को तत्काल कर सकते हैं:' struct X {int x; } myX; '' x' प्रकार का एक चर 'myX' घोषित करता है। दूसरा, सी में आप 'struct' या 'enum' नाम को छोड़ सकते हैं और इस प्रकार एक अनाम प्रकार बना सकते हैं। सी: 'enum {CONSTANT_A = 12, CONSTANT_B = 42} में स्थिरांक घोषित करने के लिए इसे अक्सर 'enum' पर उपयोग किया जाता है;' लेकिन अनामित प्रकार के चर बनाने के लिए पहले नाइट के साथ भी जोड़ा जा सकता है। जाहिर है, इस सवाल के विशेष संदर्भ में, शायद यह नहीं है कि क्या इरादा है ... –

2

वर्तमान सी ++ मानक enum एस की आगे की घोषणाओं की अनुमति नहीं देता है, हालांकि वे आने वाले सी ++ 0x मानक में आ रहे हैं।

अधिक जानकारी के लिए here देखें।

0

आप बी के टेम्पलेट पैरामीटर के रूप में घोषित कर सकते हैं इसे हल करने का दूसरा तरीका int का उपयोग कर रहा है - यह ज्ञात है कि C++ enum int है।

+0

यह केवल वर्तमान सी ++ में सी में जाना जाता है, प्रत्येक पूर्णांक प्रकार द्वारा उत्सर्जित किया जा सकता है कंपाइलर –

+0

@phresnel आप सही हैं, लेकिन मेरा मतलब है कि इसे किसी भी तरह से – Dewfy