2012-07-02 21 views
6

मैं निम्नलिखित कोड संकलन किया गया था:अधूरा प्रकार नेस्टेड नाम विनिर्देशक में नाम

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

यह अजीब लग सकता है, लेकिन यह विचार एक वर्ग A है कि केवल प्रकार B का एक उद्देश्य से उत्पादन किया जा सकता है करने के लिए किया गया था (जो शायद एक सिंगलटन होगा)।

समस्या यह है कि मैंने इन वस्तुओं के बीच एक परिपत्र निर्भरता बनाई है। A को B से पहले परिभाषित किया जाना चाहिए, और B को A से पहले परिभाषित किया जाना चाहिए। स्पष्ट रूप से B घोषित करने के लिए पर्याप्त नहीं है, B वास्तव में A (और इसके विपरीत) से पहले पूरी तरह परिभाषित होना चाहिए।

मैं इसके आसपास कैसे हो सकता हूं?

संपादित करें: वास्तविक त्रुटि है: अपूर्ण प्रकार 'बी' नामांकित नाम निर्दिष्ट नाम में नामित।

नोट: यहां एक और पोस्ट है जो इस जैसा है: Error: incomplete type used in nested name specifier, लेकिन यह बहुत ही templatized है और यह मुझे भ्रमित कर रहा था, इसलिए यह पोस्ट।

+1

एक विधि को एक दोस्त बनाने के लिए थोड़ा अजीब बात है। क्या आप वाकई पूरी कक्षा को दोस्त बनाना नहीं चाहते हैं? –

+0

मुझे पता नहीं था कि यह संभव था। यह कैसे किया जाता है? क्या मैं 'बी 'के अंदर' ए' और' मित्र श्रेणी ए 'के अंदर' मित्र वर्ग बी 'लिखता हूं? – anthropomorphic

+1

यह सही है ... –

उत्तर

5

सी ++ 2003 बताता है कि जब कक्षा की सामग्री का उपयोग किया जाता है, तो इस वर्ग को पूरी तरह से परिभाषित किया जाना चाहिए। आगे की घोषणा पर्याप्त नहीं है। इसका मतलब है कि आपके जैसे परिपत्र निर्भरता की अनुमति नहीं है।

पेज। एक दोस्त के रूप में पूरी कक्षा को घोषित करना चाहिए, अगर यह सब कुछ आपको चाहिए।

वैसे, दोस्त विनिर्देश, वर्ग के लिए आगे घोषणा उत्पन्न करता है निम्न कोड को देखो:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

संकलक F10 के लिए सिंटेक्स त्रुटि दे देंगे क्योंकि सी 1 अपरिभाषित है, लेकिन F11 की वजह से ठीक संकलित कर देगा दोस्त कल्पना यह अजीब लग सकता है लेकिन यह मानक और संकलक में परिभाषित किया गया है इसका पालन करें।

+0

दोनों वर्गों के रूप में दोनों वर्गों के घोषित करने के लिए मेरे लिए काम किया। धन्यवाद। – anthropomorphic

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