2012-08-15 25 views
5

मुझे पता है कि इससे पहले के प्रश्न पूछे गए हैं लेकिन मेरे शोध करने के बाद भी मुझे परिपत्र शीर्षलेख के बारे में प्रश्न हैं।सी ++ सर्कुलर हेडर में

//FooA.h 
#ifndef H_FOOA 
#define H_FOOA 

#include "foob.h" 

class FooA{ 
    public: 
     FooB *fooB; 
}; 


//FooB.h 
#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 

अब यदि मेरे पास दो परिपत्र निर्भरताएं हैं तो इस तरह मैंने लोगों को स्टैक ओवरफ्लो पर समस्या को हल करने के तरीके को देखा है। इस के साथ मेरी केवल समस्या यह है कि मेरी main.cpp में मैं पहली बार fooa.h शामिल करना चाहिए और उसके बाद

//main.cpp the right way 
#include "fooa.h" 
#include "foob.h" 

//main.cpp that will surely get a compile error 
#include "foob.h" 
#include "fooa.h" 

अब मेरे सवाल है foob.h "वहाँ अग्रेषित करने के लिए एक तरीका है कि होगा में इन कक्षाओं की घोषणा एक रास्ता है मुझे उस आदेश के बारे में परवाह करने की अनुमति न दें जिसमें मैं अपने main.cpp में हेडर फाइलें शामिल करता हूं? "

+0

जवाब के रूप में में ही बताया है, आप दोनों फाइलों में एक आगे घोषणा कर सकते हैं। यदि स्थिति अधिक जटिल थी, तो आप 'foob.h' से' fua.h "शामिल कर सकते हैं, जो आपके इच्छित आदेश को गारंटी देगा। –

+0

उदाहरण कोड में शामिल करने में कुछ भी परिपत्र नहीं है। यदि आप लापता # endif सबकुछ जोड़ते हैं तो ठीक है। आपको क्या संकलन त्रुटि मिल रही है? –

उत्तर

7

क्या इन वर्गों को इस तरह से घोषित करने का कोई तरीका है जिससे मुझे उस आदेश के बारे में परवाह नहीं करने की अनुमति मिलेगी जिसमें मैं अपने main.cpp में हेडर फाइलें शामिल करता हूं?

जब से तुम सरल संकेत के साथ काम कर रहे हैं केवल, आप दोनों ही मामलों में यहां एक आगे घोषणा का उपयोग कर सकते हैं: FooB.h

#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 
#endif 
+0

@ user1600812 बिल्कुल, और मुख्य में आवश्यक फ़ाइलों को शामिल कर सकते हैं - इस उदाहरण का उपयोग करके, कोई फर्क नहीं पड़ता। – justin

+0

मुझे लगता है कि मैं अपने विशिष्ट कोड में उल्लेख करना भूल गया था। fooa.h आगे खुद को घोषित करता है क्योंकि मेरे कोड में कुछ स्वयं रेफरिंग पॉइंटर्स हैं। मेरे विशिष्ट मामले में मुझे नहीं लगता कि आप इसे अपना रास्ता कर सकते हैं क्योंकि मैं कक्षा को दो बार घोषित कर दूंगा। हालांकि उदाहरण में मैंने आपके समाधान कार्यों के ऊपर बनाया है।धन्यवाद। – user1600812

+0

@ user1600812 सी ++ एकाधिक आगे की घोषणाओं को अनुमति देता है (उदा। अलग फाइलों में)। – justin

2

आपको ऑर्डर की परवाह नहीं है क्योंकि fooa.h में foob.h, और foob.h में FooA के लिए आगे की घोषणा है। सब कुछ आपके कोड में पहले से ही सही है।

+1

मॉडुलो गायब # एंडिफ है, पोस्ट किए गए कोड के साथ बिल्कुल कोई समस्या नहीं है। कोई परिपत्र नहीं है, या तो, मुझे संदेह है कि कुछ याद आ रही है। –

1

FooA.h

#ifndef H_FOOA 
#define H_FOOA 

// #include "foob.h" << not needed! 
class FooB;  // << substitute with a forward declaration of FooB 

class FooA{ 
    public: 
     FooB *fooB; 
}; 
#endif 

चूंकि दोनों वर्गों में केवल एक सूचक होता है, इसलिए आपको अन्य शीर्षलेख को शामिल करने की आवश्यकता नहीं होती है। एक आगे की घोषणा करेंगे।

कोई भी कोड जो वास्तव में अन्य कक्षा का उपयोग करता है शीर्षलेख की आवश्यकता होगी, लेकिन यह एक सीपीपी फ़ाइल में होना चाहिए।

1

दोनों शीर्षलेख फ़ाइलों में आगे की घोषणा का उपयोग करें।

क्या आप जानते हैं कि आप इसे उसी लाइन पर घोषित कर सकते हैं?

"FooB.h"

class FooB{ 
    public: 
     class FooA *fooA; 
}; 

"FooA.h" में

class FooA { 
    public: 
     class FooB *fooB; 
}; 
+0

क्रमशः FooB :: FooA और FooA :: FooB को आगे संदर्भ नहीं देगा? –