2011-12-15 11 views
7

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

MyClass::MyClass() : 
    m_one(nsConstants::ONE), 
    m_two(nsConstants::TWO), 
    m_three(nsConstants::THREE) 
{} 

मैं चाहता हूँ:

MyClass::MyClass() : 
    using namespace nsConstants; 
    m_one(ONE), 
    m_two(TWO), 
    m_three(THREE) 
{} 

_

+1

यह कौन सी भाषा है? कृपया उचित टैग करें। –

+0

क्षमा करें Tomasz, और टिप्पणी के लिए धन्यवाद। सी ++ टैग जोड़ने के लिए संपादित किया गया। – Ant

+1

भ्रम से बचने के लिए इसे "सीटीओ-प्रारंभकर्ता" कहा जाना चाहिए क्योंकि सी ++ व्याकरण तत्व "प्रारंभकर्ता-सूची" कुछ और है (कुल प्रारंभकर्ताओं के लिए '{}' के बीच का हिस्सा)। और शेष फ़ाइल को "प्रदूषण" में उपयोग करने के साथ इतना बुरा क्या है? यह आपकी .cxx फ़ाइल है, हेडर नहीं, इसलिए यह ठीक होना चाहिए। एक और विकल्प 'nsConstants :: ONE;' का उपयोग करना होगा, लेकिन आप जो चाहते हैं वह संभव नहीं है। – PlasmaHH

उत्तर

4

आप नहीं कर सकते। सबसे प्रदूषण-कम से कम प्रदूषण फैलाने से,

// The stuff you want to use. 
namespace foo { namespace bar { 
    class Frob {}; 
} } 

अब: मानक कुछ कम अच्छा विकल्प प्रदान करता है।

typedef अपने वर्ग परिभाषा के private खंड में है कि उर्फ ​​लिखने के लिए संभव बनाता है:

// I) 
class Schwarzschild { 
      typedef foo::bar::Frob FbFrob; 
public: Schwarzschild() : a(FbFrob()), b(FbFrob()) {} 
private: FbFrob a,b,c; 
}; 

लेकिन क्या आप भी यह यूनिट दुनिया भर में उपयोग कर सकते हैं, लेकिन एक अवसर के साथ यह नाम बदलने के लिए:

// II) 
class Schwarzschild { 
public: Schwarzschild(); 
private: foo::bar::Frob a,b,c; 
}; 

// cxx-file 
typedef foo::bar::Frob FbFrob; 
Scharzschild::Scharzschild() : a(FbFrob()) {} 

भी कर सकते हैं उर्फ ​​नामस्थान:

// III) 
namespace fb = foo::bar; 
class Planck { 
public: Planck() : a(fb::Frob()), b(fb::Frob()) {} 
private: fb::Frob a,b,c; 
}; 

या आप चेरी प्रतीकों अन्य नामस्थान से, चुन सकते हैं नुकसान यह है कि आपके Frob अनुवाद की अपनी यूनिट में एक और Frob के साथ भिड़ना सकता है के साथ:

// IV) 
using foo::bar::Frob; 
class Mach { 
public: Mach() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

बस पूर्णता के लिए के लिए, सबसे प्रदूषण समाधान using namespace है।

// V) 
using namespace foo::bar; 
class Newton { 
public: Newton() : a(Frob()), b(Frob()) {} 
private: Frob a,b,c; 
}; 

ध्यान दें कि तृतीय, चतुर्थ और पंचम भी अपने CXX-फाइल करने के लिए, स्च्वार्ज़स्चिल्ड-उदाहरण में सीमित किया जा सकता है।

+0

आपके पूर्ण उत्तर फ्रेसनेल के लिए धन्यवाद, मेरे पास नामस्थान में बहुत से प्रकार हैं जिसका अर्थ I, II और IV में बहुत अधिक अतिरिक्त कोड होगा। III नामस्थान को छोटा करता है लेकिन मेरे मामले में यह पहले से ही छोटा है और वी वह है जिसे मैं टालना चाहता हूं। तो इस मामले में मैं अपने मूल कोड से चिपके रहूंगा। – Ant

0

यह स्पष्ट रूप से संभव नहीं है। सी ++ में "स्थानीय उपयोग" जैसी कोई चीज़ मौजूद नहीं है। तो आपको स्कोप ऑपरेटर से चिपकना होगा या using का उपयोग करना होगा।

+0

>> सी ++ में "स्थानीय उपयोग" जैसी कोई चीज़ नहीं। खैर मेरा मतलब था: शून्य myFunction() { नामस्थान nsConstants का उपयोग कर; i = ONE; } जो सी ++ में है। विवरण के लिए स्टैक ओवरफ्लो पर कई अन्य प्रविष्टियां देखें। (क्षमा करें, मैं इसे कोड के रूप में प्रारूपित नहीं कर सकता।) – Ant

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