2011-09-28 20 views
6

मैं एक पुराने डेटा संरचनाओं किताब पढ़ रहा था और यह कहा कि जब आप टेम्पलेट वर्ग प्रोग्रामिंग कर रहे हैं आप ज फ़ाइल के अंत में सीपीपी को शामिल करना चाहिए के अंत में सीपीपी भी शामिल है।टेम्पलेट हेडर फाइल

जहाँ तक मुझे पता के रूप में आप किसी भी टेम्पलेट वर्ग के सदस्य कार्यों के लिए अपने ज फ़ाइल में पूर्ण समारोह कार्यान्वयन करना है - यह तरीका के कारण टेम्पलेट संकलक काम करता है।

मुझे सिखाया गया एकमात्र कार्य टेम्पलेट वर्ग के लिए कार्यान्वयन फ़ाइल में रखा जा सकता था टेम्पलेट विशेषज्ञता फ़ंक्शन i.e .: template<> Class<Type>::function_name()

यह पुस्तक .hpp के अंत में .cpp को शामिल करने का सुझाव क्यों देगी? क्या यह हेडर के साथ संकलित करने के दौरान कार्यान्वयन को अलग-अलग फ़ाइलों में अलग करने का एक तरीका है? और यदि हां, तो आप वास्तविक विशेषज्ञता कहां रखेंगे - मुझे लगता है कि वे हेडर द्वारा शामिल .cpp में नहीं जा सके।

उत्तर

9

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

लेकिन "सीपीपी" फ़ाइल एक्सटेंशन थोड़ा उलझन में है। आम तौर पर उन फ़ाइलों को "इनलाइन सी ++" के लिए "ipp" कहा जाता है।

+2

मैंने अपने जीवन में कभी भी इन फ़ाइलों को 'ipp' –

+0

@JohnDibling नाम से नहीं देखा है: यह सब कुछ बढ़ावा है। इसके बारे में प्रश्न पहले भी एसओ पर उठाए गए थे। –

+0

देखें http://stackoverflow.com/questions/543507/in-the-c-boost- पुस्तकालय- क्यों-is-there-a-ipp-extension-on-some-header-files –

3

यह शायद पुरानी प्रवृत्ति है, और मुझे लगता है कि कार्यान्वयन और घोषणा को अलग करने का आपका विश्लेषण सही है। वापस जब यह विशेष पुस्तक लिखी गई थी, तो लेखक ने शायद एक सीपीपी फाइल को उस फाइल के रूप में सोचा था जहां परिभाषाएं थीं, और एच फाइलें उन फाइलों के रूप में थीं जहां घोषणाएं थीं। पूर्व फ़ाइल में वास्तविक स्पष्ट विशेषज्ञता डालने, स्वाभाविक रूप से, बार-बार परिभाषाओं के कारण लिंकर को घातक (या कम से कम बेकार) होना चाहिए। आजकल, मैं परिभाषा फाइल नामकरण से बचने के लिए .cpp।

0

जहाँ तक मुझे पता के रूप में आप किसी भी टेम्पलेट वर्ग के सदस्य कार्यों के लिए अपने ज फ़ाइल में पूर्ण समारोह कार्यान्वयन करना है - यह तरीका टेम्पलेट संकलक काम करता है की वजह से है।

हो सकता है किताब मान लिया है कि आप अपने .cpp फ़ाइल में पूर्ण समारोह कार्यान्वयन है।

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

0

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

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

यह स्वाद का विषय है। यदि सदस्य फ़ंक्शन निकाय कम हैं, तो आप उन्हें इनलाइन भी परिभाषित कर सकते हैं। यह भी ध्यान रखें कि कक्षा परिभाषा के अंदर परिभाषित कार्यों को पूरी तरह से inline घोषित किया गया है, जबकि आपको स्पष्ट रूप से निर्दिष्ट करना होगा कि यदि आप अलग-अलग निकायों को लिखते हैं।

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

// FooInt.hpp 
template <typename> class Foo; 
template <> class Foo<int> 
{ 
    // your class here 
}; 

एक बात आप मन में था हो सकता है, "स्पष्ट टेम्पलेट इन्स्टेन्शियशन" है एक ला template class Foo<int>;: तो आप का इलाज जैसे है

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

1

सबसे पहले, वहाँ कोई नियम है कि आप अपने .h (या .hpp, या .hh) फ़ाइल में टेम्पलेट्स के कार्यान्वयन के लिए है कि है, वास्तव में, लेकिन सबसे सरल टेम्पलेट्स के लिए, मैं ऐसा करने के खिलाफ अनुशंसा करता हूं। फ़ाइल के बावजूद, आप को कार्यान्वयन को शामिल करना चाहते हैं। लेखक शायद दिमाग में था कि इसे .cpp फ़ाइल में कार्यान्वित करना था, और इसमें शामिल है। मैं एक अलग नाम, ढूंढने की अनुशंसा करता हूं, क्योंकि अधिकांश लोग (और कुछ आईडीई) मान लेंगे कि आपको सभी .cpp फ़ाइलों को संकलित करना चाहिए। एक आम सम्मेलन जहां .cc और .hh स्रोतों और शीर्षलेखों के लिए सामान्य एक्सटेंशन .tcc टेम्पलेट कार्यान्वयन के लिए हैं; एक विंडोज़ दुनिया में (जहां .cpp लगभग सार्वभौमिक है), मैं .tpp जैसे कुछ की सिफारिश करता हूं।

ध्यान दें कि टेम्पलेट्स के शुरुआती कार्यान्वयन के लिए कार्यान्वयन .cpp में होना आवश्यक है। इन कार्यान्वयनों को (या अनुमति) की आवश्यकता नहीं है, हालांकि, इसे शामिल किया जाना चाहिए; संकलक .cpp (या .cc) जिसमें टेम्पलेट वर्ग परिभाषा या समारोह घोषणा दिखाई दिया .hpp (या .hh) फ़ाइल के लिए इसी के लिए खोज की है, और एक डमी स्रोत फ़ाइल जो यह (और कुछ और जो जरूरी हो गया था शामिल उत्पन्न)।

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