2010-04-11 23 views
6

क्या मुझे इसी नाम से नामस्थान में .cpp से कोड डालना है या घोषणा के जरिए लिखना पर्याप्त है?क्या यह नामस्थान में होना चाहिए?

//file .h 
namespace a 
{ 
/*interface*/ 
class my 
{ 
}; 
} 

//file .cpp 

using a::my; // Can I just write in this file this declaration and 
      // after that start to write implementation, or 
      // should I write: 

namespace a //everything in a namespace now 
{ 
//Implementation goes here 
} 

धन्यवाद।

उत्तर

4

मैं namespace a { ... } ब्लॉक के भीतर नामस्थान में होने वाले सभी कोड को घेरने के लिए अधिक उपयुक्त मानता हूं, जैसा कि है अर्थात् आप क्या कर रहे हैं: आप a नामस्थान के भीतर तत्वों को परिभाषित कर रहे हैं। लेकिन अगर आप केवल सदस्यों को परिभाषित कर रहे हैं तो दोनों चीजें काम करेंगे।

संकलक void my::foo() पाता है, यह निर्धारित करने के लिए क्या my है की कोशिश करेंगे, और यह using a::my मिलेगा, कि से my को हल करने और समझते हैं कि आप a::my::foo विधि को परिभाषित कर रहे हैं।

दूसरी ओर इस दृष्टिकोण अगर तुम मुक्त कार्यों का उपयोग कर रहे असफल हो जायेगी:

// header 
namespace a { 
    class my { // ... 
    }; 
    std::ostream & operator<<(std::ostream& o, my const & m); 
} 
// cpp 
using a::my; 
using std; 
ostream & operator<<(ostream & o, my const & m) { 
    //.... 
} 

संकलक खुशी से एक कार्यक्रम में उपरोक्त कोड का अनुवाद होगा, लेकिन क्या यह वास्तव में क्या कर रही है शीर्षक में std::ostream& a::operator<<(std::ostream&, a::my const &) की घोषणा कर रहा है फ़ाइल - कार्यान्वयन के बिना-, और cpp फ़ाइल में std::ostream& ::operator<<(std::ostream &, a::my const &) को परिभाषित करना, जो एक अलग कार्य है। Koening देखने, जब भी संकलक प्रकार a::my की obj साथ cout << obj देखता है का उपयोग करना, संकलक cout और my (std, और a) की संलग्नित नामस्थान में दिखेगा और है कि वहाँ एक a::operator<< घोषित लेकिन namespace a में परिभाषित किया गया कभी नहीं मिलेगा। यह संकलित होगा लेकिन आपके कोड को लिंक नहीं करेगा।

+0

+1। नेमस्पेस में क्या है 'नेमस्पेस {} 'में है। इस तरह की चीजें इंडेंटेशन की मांग नहीं करती हैं इसलिए वास्तव में कोई परेशानी नहीं है। – Potatoswatter

1

अगर मैं सवाल का सही ढंग से समझ, तुम सिर्फ एक :: मेरी और फिर बस को लागू तरीकों का उपयोग कर,

using a::my; 

void my::doSomething() {} 
0

की तरह आप यह कर सकते हैं हो सकता है। लेकिन, आपको चाहिए?

यह एक असामान्य अभ्यास है, और यह शायद .cc फ़ाइल में उपयोग किए गए नामस्थान 'ए' से प्रत्येक प्रकार के लिए using a::Type; का प्रसार करेगा। चाहे यह तय करने के लिए एक अच्छी बात है, लेकिन मैं इसके खिलाफ वोट दूंगा :)

+0

आप 'नेमस्पेस ए का उपयोग करके' भी उपयोग कर सकते हैं और कोड में एक बड़ा नामस्थान {}} रखने के बिना कोड को कार्यान्वित कर सकते हैं। नेमस्पेस घोषणा हेडर के लिए हैं। – luiscubal

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