2013-05-31 7 views
7

मुझे क्लैंग कंपाइलर का उपयोग कर सी ++ में फॉरवर्ड घोषणा के साथ कोई समस्या है। मेरा कोड यहाँ है। यह अपूर्ण प्रकार के रूप में CReference सदस्य में डेटा इंगित करता है। सी ++ में कक्षा के आगे की घोषणा, अपूर्ण प्रकार

class Internal; 

class CReference { 
private: 
    Internal data; 
public: 

    CReference() {}  
    ~CReference(){} 
}; 

class Internal { 
public: 
    Internal() {} 
    ~Internal() {} 
}; 
+0

आप बस यहां एक आगे की घोषणा का उपयोग नहीं कर सकते हैं। 'CReference' को 'आंतरिक' की पूर्ण घोषणा की आवश्यकता है। – juanchopanza

+0

यदि आप इसे घोषित करना चाहते हैं तो आपको 'आंतरिक' पर पॉइंटर का उपयोग करना चाहिए। – user1520427

+1

संभावित डुप्लिकेट [आगे की घोषणा का उपयोग कब करें?] (Http://stackoverflow.com/questions/553682/when-to-use-forward-declaration) – juanchopanza

उत्तर

3

फॉरवर्ड घोषणा कृपया मदद केवल आप इसे करने के संकेत दिए गए और संदर्भ उपयोग करने के लिए, जब तक पूर्ण घोषणा उपलब्ध

15

फॉरवर्ड घोषणा उपयोगी होते हैं, जब संकलक प्रकार की पूरी परिभाषा की जरूरत नहीं है की अनुमति देता है। दूसरे शब्दों में, यदि आप अपना Internal data;Internal* data या Internal& data बदलते हैं, तो यह काम करेगा।

Internal data; का उपयोग करके, कक्षा की संरचना बनाने में सक्षम होने के लिए संकलक को Intrenal की संपूर्ण परिभाषा जानने की आवश्यकता है।

+0

लगभग एक सही उत्तर। जो कुछ भी बचा है, वह यह उल्लेख करना है कि वह आंतरिक उपरोक्त संदर्भ की परिभाषा को स्थानांतरित कर सकता है और यह काम करेगा। –

+0

@ रिकॉर्गेसन - ज़ाहिर है, लेकिन मुझे लगता है कि ओपी जानता है कि, स्पष्ट दिखता है, क्योंकि 'कक्षा आंतरिक' को 'कक्षा क्रांति' के बारे में "जानने" की आवश्यकता नहीं है। –

1

किसी वर्ग के सदस्य के रूप में एक प्रकार का उपयोग करने के लिए संकलक को यह पता होना चाहिए कि यह कितना बड़ा है, ताकि वर्ग का आकार सही ढंग से गणना की जा सके। एक आगे की घोषणा उस जानकारी को प्रदान नहीं करती है (सी ++ आगे नहीं देखेगी और इसे खोजने का प्रयास करें, खासकर जब शरीर को किसी अन्य अनुवाद इकाई में घोषित किया जा सकता है), इसलिए आप इसे एक मूल्य-सदस्य के रूप में उपयोग नहीं कर सकते हैं।

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

0

जैसा ऊपर बताया गया है। हेडर में कक्षा के केवल एक सादे सूचक का उपयोग करते समय आगे की घोषणा में हेडर फ़ाइलों में हेडर नरक से बचने के लिए इसका उपयोग किया गया है।

आप आमतौर पर जितना संभव हो सके शीर्षलेख फ़ाइलों में शामिल रखना चाहते हैं। यह कक्षा को आगे घोषित करके हासिल किया जा सकता है, लेकिन केवल तभी जब यह एक नेस्टेड क्लास नहीं है और केवल तभी होता है जब पॉइंटर हेडर में उपयोग किया जाता है, क्योंकि इसके लिए सूचक आकार आवश्यक जानकारी है, जो आगे की घोषणा द्वारा प्रदान की जाती है।

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