2009-06-15 7 views
14

मैं सी ++ के लिए नया हूँ का उल्लेख है, तो इस सवाल का बुनियादी हो सकता है:दो वर्गों है कि एक दूसरे को

मैं दो वर्गों है कि एक दूसरे से उल्लेख करने के लिए की जरूरत है। प्रत्येक अपनी शीर्ष लेख फ़ाइल में है, और # अन्य की हेडर फ़ाइल शामिल है। जब मैं संकलन करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है "आईएसओ सी ++ कक्षाओं में से किसी एक के लिए 'फू' की घोषणा को मना नहीं करता है। अगर मैं चीजों को बदलता हूं तो विपरीत हेडर पहले पार्स हो जाता है, मुझे दूसरी कक्षा के साथ एक ही त्रुटि मिलती है।

क्या सी ++ में दो कक्षाएं हो सकती हैं जिन्हें एक दूसरे के संदर्भ की आवश्यकता है?

अधिक जानकारी के लिए: मेरे पास "ऐप" कक्षा और "विंडो" कक्षा है। खिड़की बनाने के लिए ऐप को विंडो को संदर्भित करने की आवश्यकता है। विंडो में एक बटन है जो ऐप पर वापस कॉल करता है, इसलिए इसे ऐप के संदर्भ की आवश्यकता होती है। यदि मेरे पास दो वर्ग नहीं हो सकते हैं, तो क्या इसे लागू करने का एक बेहतर तरीका है?

+2

यह ध्यान दिया जाना चाहिए कि जब संभव हो तो परस्पर निर्भरता से बचा जाना चाहिए। क्या ऐप में बटन को एक अलग नियंत्रक-आइश ऑब्जेक्ट में कॉल करने की कार्यक्षमता को कारगर करना समझदारी होगी? –

+0

मुझे यह समस्या अक्सर मेरे छोटे खेलों में मिलती है। मेरे पास एक गेम ऑब्जेक्ट है जिसमें गेम ऑब्जेक्ट्स हैं जिन्हें वर्ल्ड ऑब्जेक्ट को संदर्भित करने की आवश्यकता है। टक्कर की पहचान हुई है। इसे दोबारा करने के लिए एक अच्छा तरीका नहीं मिला है। (और बीटीडब्ल्यू, मुझे कुछ प्रकार की बैज कमाने के लिए 7 साल की एक चर्चा को जागृत करना) – Johan

उत्तर

27

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

class App; 

App.h में इस पंक्ति जोड़ें:: Window.h में, इस लाइन को जोड़ने के

class Window; 

वर्ग परिभाषाओं से पहले ये पंक्तियां जोड़ें।

फिर स्रोत फ़ाइलों में, आप वास्तविक वर्ग परिभाषाओं के लिए शीर्षलेख शामिल कर सकते हैं।

यदि आपकी कक्षा परिभाषाएं अन्य वर्ग के संदर्भ सदस्यों (उदाहरण के लिए, इनलाइन में) संदर्भित करती हैं, तो उन्हें स्रोत फ़ाइल में स्थानांतरित करने की आवश्यकता होती है (अब इनलाइन नहीं)।

8

आगे की घोषणा जाने का तरीका है।

यदि आप कक्षा शीर्षलेख में पॉइंटर्स \ संदर्भ का उपयोग कर रहे हैं तो दोनों तरफ आगे की घोषणा आपके लिए काम करेगी।

यदि आप क्लास सदस्य के रूप में ऑब्जेक्ट बना रहे हैं तो आपको हेडर को ही शामिल करना होगा। (फॉरवर्ड घोषणा काम नहीं करेगी क्योंकि कंपाइलर को आकार जानने के लिए कक्षा परिभाषा की आवश्यकता है)।

Refer C++ FAQ for solving such senario:

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