2010-01-17 33 views
26

मेरे पास हेडर फ़ाइल में नामस्थान के भीतर कुछ इनलाइन फ़ंक्शंस हैं और वर्तमान में उन्हें एक सीपीपी फ़ाइल में स्थानांतरित करने की स्थिति में नहीं है। इन इनलाइन कार्यों में से कुछ उदाहरण के लिए जादू स्थिरांक का उपयोग करें,:इनलाइन नेमस्पेस हेडर में निजी स्थिरांक छुपाएं

// Foo.h 
namespace Foo 
{ 
    const int BAR = 1234; 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

हालांकि, मैं इन जादू स्थिरांक निजी बनाना चाहते हैं - किसी भी विचार कैसे?

// Foo.h 
namespace Foo 
{ 
    namespace 
    { 
     // 'private' constants here 
     const int BAR = 1234; 
    } 

    inline void someFunc() 
    { 
     // Do something with BAR 
    } 
} 

बहरहाल, यह काम नहीं करता है और किसी भी Foo::BAR cpp फ़ाइल कि Foo.h शामिल करने के लिए उपलब्ध है: मेरी पहली सोचा एक गुमनाम नाम स्थान इस प्रकार का इस्तेमाल किया गया? कार्यान्वयन सीपीपी फाइल बनाने के बिना ऐसा करने का कोई तरीका है?

उत्तर

28

आप नहीं कर सकते हैं, अज्ञात नामस्थान उन अनुवाद इकाई के लिए काम करते हैं जिन्हें वे परिभाषित करते हैं (या आपके मामले में शामिल हैं)।

namespace foo { 
    namespace detail { 
     int magic = 42; 
    } 

    // ... use detail::magic 
} 
+4

यह सम्मेलन बूस्ट उपयोग भी है। यह तब तक अच्छी तरह से काम करता है जब तक आप सभी को सरल बताते हैं, "कभी भी एक विस्तार नामस्थान दर्ज न करें।", जो कि वैसे भी नहीं करेगा। – GManNickG

3

उन्हें एक विशेष नाम स्थान में रख दें या उन्हें विशेष रूप से नाम दें, एक परियोजना सम्मेलन के साथ संयुक्त ऐसी बातें गैर हैं कि:
आप उन्हें उपयोगकर्ता कि वे आंतरिक जानकारी दी जा रही करने के लिए संकेत करने के लिए एक detail नेम स्पेस में ले जाने पर विचार कर सकता है -public:

namespace foo { 
    namespace detail { // as in "implementation details" 
    inline int answer() { return 42; } 
    const int perfect = 28; 
    } 
    std::string _question(); // not part of foo's "public interface" by convention 

    int this_is_public() { 
    using namespace detail; // now don't have to prefix detail:: 
    return answer() + perfect + _question().length(); 
    } 
} 

गैर सरकारी के रूप में दस्तावेज नाम का उपयोग कोई भी किसी भी "संरक्षण" तुम कोशिश को नाकाम करेंगे; जो वास्तविक चिंता को हाइलाइट करता है: सार्वजनिक इंटरफ़ेस का हिस्सा क्या दस्तावेज करना और उस पर भरोसा किया जा सकता है।

अनाम नाम एक अलग समस्या हल करते हैं: किसी विशेष टीयू के लिए अद्वितीय नाम प्राप्त करना। वे यहां मदद नहीं करेंगे।

16

कैसे के बारे में:

namespace Foo { 
    class foo_detail { 
    private: 
     enum { 
      BAR = 1234, 
     }; 

     friend void someFunc(); 
    }; 

    inline 
    void someFunc() { 
     // something with foo_detail::BAR 
    } 
} 

यह कार्यों आप दोस्तों के रूप में चिह्नित की तुलना में किसी और के लिए निरंतर nonaccessible बनाता है। आप यह सुनिश्चित करने के लिए कि कोई भी वर्ग को स्थापित करने का प्रयास नहीं करता है, यह सुनिश्चित करने के लिए कि आप कन्स्ट्रक्टर को निजी बनाकर कक्षा को गैर-संरचनात्मक बना सकते हैं।

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