डिफ़ॉल्ट रूप से, नामांकित फ़ंक्शंस का उपयोग करें।
कक्षाएं वस्तुओं का निर्माण करने के लिए हैं, नामस्थानों को बदलने के लिए नहीं।
ऑब्जेक्ट ओरिएंटेड कोड में
स्कॉट मेयर्स ने इस विषय पर अपनी प्रभावी C ++ पुस्तक के लिए एक पूरा आइटम लिखा था, "सदस्य कार्यों के लिए गैर-सदस्य गैर-मित्र कार्यों को प्राथमिकता दें"। मुझे हर्ब सटर के एक लेख में इस सिद्धांत का एक ऑनलाइन संदर्भ मिला:http://www.gotw.ca/gotw/084.htm
यह जानना महत्वपूर्ण है कि: C ++ में समान नामस्थान में एक वर्ग के रूप में कार्य उस वर्ग के इंटरफ़ेस से संबंधित हैं (क्योंकि ADL फ़ंक्शन कॉल को हल करते समय उन कार्यों को खोजेगा)।
जब तक "मित्र" घोषित नहीं किया जाता है, तब तक नामांकित कार्य, क्लास के इंटर्न के लिए कोई पहुंच नहीं है, जबकि स्थिर तरीके हैं।
इसका मतलब है, उदाहरण के लिए, कि अपनी कक्षा को बनाए रखने के दौरान, यदि आपको अपने वर्ग के आंतरिक को बदलने की आवश्यकता है, तो आपको स्थैतिक सहित सभी तरीकों में इसके दुष्प्रभावों की खोज करने की आवश्यकता होगी।
एक्सटेंशन I
एक वर्ग 'इंटरफ़ेस में कोड जोड़ना।
C # में, आप किसी वर्ग तक ऐसे तरीके जोड़ सकते हैं, भले ही आपकी कोई पहुँच न हो। लेकिन C ++ में, यह असंभव है।
लेकिन, अभी भी C ++ में, आप अभी भी एक नामांकित फ़ंक्शन जोड़ सकते हैं, यहां तक कि किसी वर्ग के लिए जो आपके लिए लिखा था।
दूसरी तरफ से देखें, अपने कोड को डिज़ाइन करते समय यह महत्वपूर्ण है, क्योंकि अपने कार्यों को एक नाम स्थान पर रखकर, आप अपने उपयोगकर्ताओं को कक्षा के इंटरफ़ेस को बढ़ाने / पूरा करने के लिए अधिकृत करेंगे।
एक्सटेंशन II
पिछले बिंदु का एक साइड-इफेक्ट, कई हेडर में स्थिर तरीकों की घोषणा करना असंभव है। प्रत्येक विधि को एक ही कक्षा में घोषित किया जाना चाहिए।
नामस्थान के लिए, एक ही नाम स्थान से कई हेडर में फ़ंक्शन घोषित किए जा सकते हैं (लगभग मानक स्वैप फ़ंक्शन इसका सबसे अच्छा उदाहरण है)।
एक्सटेंशन III
एक नामस्थान की मूल शीतलता यह है कि कुछ कोड में, आप इसका उल्लेख करने से बच सकते हैं, यदि आप "का उपयोग कर" कीवर्ड का उपयोग करते हैं:
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
और आप "प्रदूषण" को एक वर्ग तक सीमित कर सकते हैं:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
यह "पैटर्न" लगभग मानक स्वैप मुहावरे के उचित उपयोग के लिए अनिवार्य है।
और कक्षाओं में स्थिर तरीकों के साथ ऐसा करना असंभव है।
तो, C ++ नेमस्पेस के अपने शब्दार्थ हैं।
लेकिन यह और आगे बढ़ जाता है, क्योंकि आप विरासत के समान नामस्थान जोड़ सकते हैं।
उदाहरण के लिए, यदि आपके पास फ़ंक्शन नाम AAA के साथ एक नाम स्थान A, फ़ंक्शन BBB के साथ एक नाम स्थान B है, तो आप नाम स्थान C की घोषणा कर सकते हैं, और कीवर्ड का उपयोग करके इस नामस्थान में AAA और BBB ला सकते हैं।
निष्कर्ष
नाम स्थान के लिए नाम स्थान हैं। कक्षाएं कक्षाओं के लिए हैं।
C ++ को डिज़ाइन किया गया था इसलिए प्रत्येक अवधारणा अलग है, और अलग-अलग मामलों में, अलग-अलग मामलों में, विभिन्न समस्याओं के समाधान के रूप में उपयोग की जाती है।
जब आपको नामस्थान की आवश्यकता हो तब कक्षाओं का उपयोग न करें।
और आपके मामले में, आपको नामस्थान की आवश्यकता है।