मैं अलग-अलग निरंतर घोषणाओं और सी ++ में परिभाषा विकल्पों के लाभ/हानिकारक के बारे में उत्सुक हूं। लंबे समय के लिए, मैं सिर्फ उन्हें हेडर फाइल के शीर्ष पर वर्ग परिभाषा से पहले घोषित किया गया है:सी ++ में कक्षा स्कोप स्थिरांक घोषित/परिभाषित करने के लिए कहां?
//.h
const int MyConst = 10;
const string MyStrConst = "String";
class MyClass {
...
};
इस वैश्विक नामस्थान (जो मैं जानता हूँ कि एक बुरी बात है को प्रदूषित करता है, लेकिन कभी नहीं पाया है कारणों की एक कपड़े धोने की सूची क्यों खराब है), स्थिरांक अभी भी अलग-अलग अनुवाद इकाइयों तक पहुंच जाएंगे, इसलिए जिन फ़ाइलों में इस हेडर को शामिल नहीं किया गया है, उन्हें इन स्थिरांक तक पहुंच नहीं होगी। लेकिन यदि आप अन्य वर्ग एक ही नाम के निरंतर परिभाषित करते हैं, तो आप नाम टकराव प्राप्त कर सकते हैं, जो तर्कसंगत रूप से बुरी चीज नहीं है क्योंकि यह उस क्षेत्र का एक अच्छा संकेत हो सकता है जिसे दोबारा किया जा सकता है।
हाल ही में, मैंने तय कर लिया है कि यह वर्ग परिभाषा के ही अंदर वर्ग विशिष्ट स्थिरांक घोषित करने के लिए बेहतर होगा:
//.h
class MyClass {
public:
static const int MyConst = 10;
...
private:
static const string MyStrConst;
...
};
//.cpp
const string MyClass::MyStrConst = "String";
निरंतर की दृश्यता निरंतर केवल आंतरिक रूप से करने के लिए प्रयोग किया जाता है जो इस पर निर्भर समायोजित किया जाएगा वर्ग या वर्ग का उपयोग करने वाली अन्य वस्तुओं के लिए आवश्यक है। यही वह है जो मैं सोच रहा हूं कि अभी सबसे अच्छा विकल्प है, मुख्य रूप से क्योंकि आप कक्षा में निजी वर्ग स्थिरांक को निजी रख सकते हैं और सार्वजनिक स्थिरांक का उपयोग करके किसी भी अन्य वर्ग में निरंतर स्रोत के स्रोत का अधिक विस्तृत संदर्भ होगा (उदाहरण के लिए MyClass: : MyConst)। यह वैश्विक नामस्थान को प्रदूषित नहीं करेगा। हालांकि इसमें सीपीपी फ़ाइल में गैर-अभिन्न प्रारंभिक आवश्यकता की कमी है।
मैं भी अपने स्वयं के हेडर फाइल में स्थिरांक चलती है और उन्हें मामले में एक नाम स्थान किसी अन्य वर्ग स्थिरांक की जरूरत में लपेटकर, लेकिन नहीं पूरी कक्षा परिभाषा पर विचार किया है।
बस राय और संभवतः अन्य विकल्प मैं अभी तक नहीं माना जाता था की तलाश में।
हां, लेकिन आप 'static' या इस मामले में एक गुमनाम नाम स्थान का उपयोग करने के - अगर आप नहीं करते हैं, कुछ कार्यान्वयन में आप वैश्विक नामस्थान को दूषित लिंकर द्वारा उपयोग किया जाता है और लिंकिंग पर नाम संघर्ष प्राप्त होता है ... – hjhill