2012-05-13 16 views
5

संभव डुप्लिकेट:
Forward declaration of nested types/classes in C++क्या सी ++ में घोंसला वाले वर्गों की भविष्यवाणी करने का कोई तरीका है?

वर्गों के सरल पार संदर्भ के लिए यह classnames predeclare और संदर्भ के रूप में उपयोग करने के लिए संभव है। इस तरह प्रतिनिधित्व एक सूचक है। लेकिन अगर मैं दोनों की घोंसला वाली कक्षा को पार करना चाहता हूं (नीचे दिए गए उदाहरण को देखें), तो मैं परेशानी में भागूंगा, क्योंकि ऐसा लगता है कि घोंसला वाले वर्ग की भविष्यवाणी करने का कोई तरीका नहीं है।

तो मेरा सवाल है: क्या नेस्टेड कक्षाओं को पूर्ववत करने का कोई तरीका है ताकि मेरा उदाहरण काम कर सके?

यदि नहीं: क्या इसके लिए कोई आम कामकाज है, जो कोड को बहुत अधिक नहीं बदलेगा?

// Need to predeclare it to use it inside 'First' 
class Second; 
class Second::Nested; // Wrong 

// Definition for my 'First' class 
class First 
{ 
public: 
    Second::Nested* sested; // I need to use the nested class of the 'Second' class. 
          // Therefore I need to predeclare the nested class. 
    class Nested { }; 
}; 

// Definition for my 'Second' class 
class Second 
{ 
public: 
    First::Nested* fested; // I need to use the nested class of the 'First' class. 
          // This is okay. 
    class Nested { }; 
}; 
+0

ठीक है - अगर मैं "घोषणा" की तलाश करता तो मुझे यह जवाब मिल गया होता। (यह संभव नहीं है।) यह बात है। धन्यवाद। लेकिन इस पल के लिए मैं एक कामकाज के बारे में सोचता हूं। मेरे नेमस्पेस के किसी अन्य 'क्लास नेस्ड' के साथ अनजान संघर्ष। और इंटरफेस के उपयोगकर्ता obfuscate का नाम बदलना। –

उत्तर

4

संक्षेप में, उत्तर नहीं है।

लेकिन अगर आप एक similar question के लिए पहले देखा जाना चाहिए था ...

संपादित करें: एक संभावित समाधान, एक और कक्षा में दोनों वर्गों लपेटकर किया जा सकता है, और आवरण के अंदर नेस्टेड कक्षाएं delcaring अग्रेषित करें।

class Wrapper 
{ 
public: 

    // Forward declarations 
    class FirstNested; 
    class SecondNested; 

    // First class 
    class First 
    { 
    public: 
     SecondNested* sested; 
    }; 

    // Second class 
    class Second 
    { 
    public: 
     FirstNested* fested; 
    }; 
}; 

इस तरह आप Wrapper::A और Wrapper::B लागू करने के लिए, जबकि अभी भी उन्हें जो कुछ भी नाम स्थान आप imlpementing रहे हैं, उससे अलग करना होगा।

+0

मैंने उस प्रश्न को देखा है, लेकिन कोई समाधान नहीं है लेकिन अनचाहे है। मुझे यकीन है कि उस समस्या के लिए एक और बेहतर समाधान होना चाहिए। एक पैटर्न की तरह कुछ, जो कक्षाओं के संबंधों को परेशान नहीं करता है। –

+0

यह उपरोक्त उदाहरण के लिए ठीक दिखता है। इस मामले में मैं इसे स्वीकार करता हूं। इसके अलावा मुझे अभी भी एक और समाधान मिलना होगा, क्योंकि मुझे कई बार ऐसे क्रॉसनेस्टिंग करने की ज़रूरत है, ताकि मैं अपने सभी वर्गों को एक रैपर वर्ग में नहीं डाल सकूं। एक नेस्टेड कक्षा के अंदर एक नेस्टेड कक्षा के बारे में सोचते हुए, यह फिर से कोई समाधान नहीं है। –

+0

आपको ऐसे मामलों के लिए साझा कक्षाएं बनाना होगा, कोई अन्य विकल्प नहीं है (या अपने डिज़ाइन पर पुनर्विचार करें)। –

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