मुझे हेडर फ़ाइल में नेमस्पेस फ़ंक्शंस को कैसे घोषित करना चाहिए?
namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON
हेडर चाहिए केवल वर्ग हेडर फाइल और कार्यान्वयन cpp फ़ाइल में होना चाहिए की तरह कार्यशील परिभाषाएँ होते हैं, या मैं सीधे हेडर फाइल में कार्यों को लागू करना चाहिए?
यह इस बात पर निर्भर करता है कि आप उन्हें (संभावित रूप से) रेखांकित या निर्यात करना चाहते हैं या नहीं। यह निर्भरता को कम करने के लिए अक्सर नीचे आता है।
निर्यात या इनलाइन किए जाने वाले पर विस्तार करने के लिए:
आप अक्सर ग में निर्भरता को कम करने के निर्वासन समारोह के पक्ष में था ++।
file.hpp
namespace MON {
// extern:
t_ret func(const t_param& pValue);
} // << MON
असम्भव
#include "hefty_stuff.hpp"
MON::t_ret MON::func(const t_param& pValue) { ... }
हालांकि, इसके लिए महत्वपूर्ण समय में है: यह एक वर्ग विधि में घोषणा से परिभाषा को अलग करने के बराबर है कुछ मामलों में दिखाई देने की परिभाषा, अक्सर प्रदर्शन के लिए या जब आप आकार जानते हैं तो महत्वपूर्ण है और शीर्षलेख में कई जगह शामिल नहीं हैं। इस प्रकार, inline
संस्करण भी एक विकल्प है।
एक इनलाइन फ़ंक्शन अभी भी निर्यात किया जा सकता है, और इसे अनुरोध के रूप में रेखांकित किया जा सकता है - हालांकि, किसी भी इनलाइन फ़ंक्शन प्रतियों को विलय किया जा सकता है (विशेष रूप से, कार्यान्वयन यह मानने के लिए स्वतंत्र है कि सभी परिभाषाएं बराबर हैं और फ़ंक्शन की कोई प्रतियां हैं अनावश्यक)।
निर्यात की गई परिभाषाओं के साथ, आप चुनिंदा रूप से अपनी शामिल निर्भरताओं को प्रतिबंधित (या संगरोध) कर सकते हैं। file.hpp
में फ़ंक्शंस का उपयोग करने के लिए शीर्षलेख में नहीं होना चाहिए।
मूल रूप से, मुझे लगता है कि कुछ आदेश होता है एक पाठ फ़ाइल को पार्स करने के लिए एक आवेदन को लागू करने की कोशिश कर रहा हूँ। तो मैं पाठ प्रसंस्करण को संभालने के लिए स्थिर सहायक विधियों को लागू करने के बारे में सोच रहा हूं।
अच्छी तरह से, static
से बचा जाना चाहिए। सी ++ एक परिभाषा-नियम का उपयोग करता है। static
के परिणामस्वरूप बहुत सारी अनावश्यक प्रतियां होंगी।
namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon
टिप्पणी: गुमनाम नामस्थान भी अनावश्यक प्रतियां में हो सकता है इसके अलावा, एक गुमनाम नाम स्थान C++ सी के static
कार्य करने के लिए दृष्टिकोण है। एक स्थिर कार्य के लिए एक विकल्प के रूप में आप उनका उपयोग करने का कारण यह है कि यदि आप एक परिभाषा-नियम से विचलित होना चाहते हैं, और प्रतीक को उस दायरे में घोषित नहीं करना चाहते हैं जिसे 'हल किया जा सकता है'।
अंतिम बिंदु template<>
घोषणाओं का संबंध है। टेम्पलेट्स के साथ, जब तक आपका कंपाइलर बाहरी टेम्पलेट का समर्थन नहीं करता तब तक परिभाषा दिखाई देनी चाहिए। टेम्पलेट्स के लिए, आप कई तरीकों से परिभाषा दृश्यता को पूरा कर सकते हैं। आम तौर पर, लोग बस परिभाषा को परिभाषित करेंगे, या परिभाषाओं के लिए एक शीर्षलेख जोड़ देंगे जो हेडर के अंत में या आवश्यकतानुसार शामिल है। टेम्पलेट्स के साथ, कई परिभाषा त्रुटियों से बचने के लिए कार्यों को inline
घोषित करने की आवश्यकता नहीं है।
सी ++ कार्य करता है और वर्गों के बीच एक बहुत तेज भेद ड्रॉ । यह आपके प्रश्न से स्पष्ट नहीं है जिसे आप उपयोग करने में रुचि रखते हैं। – Shep
हाय शेप, टिप्पणी के लिए धन्यवाद। मैंने अपने प्रश्न के लिए और विवरण जोड़ा। क्या यह आपके प्रश्न का उत्तर देता है? –