2010-05-14 19 views
5

एकाधिक एकाधिक समावेशन मुझे C++ कोड में हेडर फ़ाइल के एकाधिक समावेशन के संबंध में कोई समस्या है।हेडर फ़ाइल सी ++

उदाहरण के लिए, मेरे पास तीन वर्ग एक्स, वाई, जेड है। एक्स और वाई बेस क्लास जेड से व्युत्पन्न हैं। और मैं वाई में एक्स का एक उदाहरण बनाना चाहता हूं। कोड इस तरह होगा।

class Z{some code} 

class X:public Z{some code};//here #include header of class Z added 

class Y:public Z //here #include header of class Z added as well as of X class 

{private: 
    X* mX;//instance of X 

some code}; 

तो बेस क्लास के सभी तरीकों की इस एकाधिक परिभाषा में उत्पन्न होता है। मैं कैसे इस समस्या को

+0

[C++ परिभाषा] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2823330/redefinition-c) –

उत्तर

8

का उपयोग के साथ सामना कर सकते हैं "गार्ड में शामिल हैं" (Wikipedia link)

#ifndef MYHEADER_H 
#define MYHEADER_H 

// header file contents go here... 

#endif // MYHEADER_H 

यह मुहावरेदार कोड, आसानी से किसी भी अनुभवी C और C++ प्रोग्रामर कारण पहचानी है। MYHEADER_H को आपके लिए विशिष्ट कुछ में बदलें, उदाहरण के लिए यदि हेडर CustomerAccount नामक कक्षा को परिभाषित करता है, तो आप गार्ड CUSTOMERACCOUNT_H पर कॉल कर सकते हैं।


अपने विशिष्ट मामले में, प्रत्येक वर्ग के लिए एक अलग शीर्षलेख/स्रोत फ़ाइल है।

#ifndef Z_H 
#define Z_H 

// Code of Z class 

#endif Z_H 

अब, दोनों एक्स के शीर्ष लेख और वाई सुरक्षित रूप से z.h शामिल कर सकते हैं - यह केवल सच में एक .cpp फ़ाइल है कि दोनों x.h और भी शामिल है में एक बार शामिल किया जाएगा: जेड वर्ग के लिए हेडर फाइल एक में शामिल गार्ड होगा y.h और कोई डुप्लिकेशन नहीं होगा।

हमेशा ध्यान रखें कि सी और सी ++ में वास्तव में संकलित हो जाता है स्रोत (.c या .cpp) फ़ाइलें हैं, हेडर फाइल नहीं। हेडर फाइलें प्रीप्रोसेसर द्वारा स्रोत फ़ाइलों में "कॉपी-पेस्ट" होती हैं जो include उन्हें होती हैं।

+0

तुम मेरे उदाहरण है अगर साथ अधिक विशिष्ट कृपया कर सकते आप दिमाग में नहीं हैं। – boom

+0

@iSight: अपडेट किया गया। क्या यह पर्याप्त है? –

+0

कई सारे थेंक्स बहुत सारे हैं। यह काम किया। – boom

1

आप गार्ड या हेडर गार्ड शामिल कहलाते हैं। वे कुछ इस तरह जाना:

// within some_header.h 
#ifndef SOME_HEADER_H 
#define SOME_HEADER_H 

// stuff goes here 

#endif 

अनिवार्य रूप से, मैक्रो के आसपास पहली बार तो सब कुछ अंदर शामिल किया गया है निर्धारित नहीं किया गया। हालांकि, बाद में पहली बार शामिल होने के बाद कोई प्रभाव नहीं पड़ेगा।

नामकरण योजना, सभी नामकरण योजनाओं की तरह, पूरी तरह मनमाने ढंग से और आपके ऊपर है। मैं उस नाम में फ़ाइल नाम को न्यूनतम के रूप में शामिल करना चाहता हूं, जैसा कि मैंने ऊपर किया था। मैं अपनी असली परियोजनाओं में नामस्थान और परियोजना के नाम भी शामिल करता हूं।

कुछ चीजें देखने के लिए बाहर हैं। आप इस तरह की चीजों को करने के लिए लुभाने वाले हो सकते हैं:

#define _SOME_HEADER_H__ 

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

3

आप #pragma का उपयोग हेडर फ़ाइलों में प्रीप्रोसेसर निर्देश का भी उपयोग कर सकते हैं। (कोई ज़रूरत नहीं #ifndef #define #endif के बारे में परेशान करने के लिए)

+0

बेस क्लास हेडर या व्युत्पन्न क्लास हेडर में इस निर्देश का उपयोग कहां करें। – boom

+0

@iSight को सभी (आधार और प्राप्त) कक्षा शीर्षलेख फ़ाइलों को परिभाषित करने की आवश्यकता है – santhosh

+0

#pragma के लिए +1 – hyde

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