2008-10-05 15 views
27

में नामस्थान और ऑपरेटर ओवरलोडिंग किसी विशेष नामस्थान में लाइब्रेरी को अधिकृत करते समय, उस नामस्थान में कक्षाओं के लिए ओवरलोडेड ऑपरेटरों को प्रदान करना अक्सर सुविधाजनक होता है। ऐसा लगता है (कम से कम छ साथ ++) कि अतिभारित ऑपरेटरों या तो लाइब्रेरी की नाम स्थान में लागू किया जा सकता:सी ++

namespace Lib { 
class A { 
}; 

A operator+(const A&, const A&); 
} // namespace Lib 

या वैश्विक नामस्थान

namespace Lib { 
class A { 
}; 
} // namespace Lib 

Lib::A operator+(const Lib::A&, const Lib::A&); 

मेरे परीक्षण से, वे दोनों ठीक से काम करने लगते हैं। क्या इन दो विकल्पों के बीच कोई व्यावहारिक अंतर है? क्या या तो बेहतर दृष्टिकोण है?

उत्तर

29

आपको उन्हें लाइब्रेरी नेमस्पेस में परिभाषित करना चाहिए। संकलक उन्हें तर्क निर्भर लुकअप के माध्यम से वैसे भी मिल जाएगा।

वैश्विक नामस्थान को प्रदूषित करने की कोई आवश्यकता नहीं है।

+4

लाइब्रेरी नेमस्पेस का उपयोग करने का एक अन्य कारण: [यह पोस्ट] (http://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution) में एक उदाहरण है जहां वैश्विक नामस्थान का उपयोग करना काम नहीं करता है। – Tim

2

आपको इसे नामस्थान में परिभाषित करना चाहिए, क्योंकि सिंटैक्स कम वर्बोज़ होगा और वैश्विक नामस्थान को अव्यवस्थित नहीं करेगा।

namespace Lib { 

class A { 
public: 
    A operator+(const A&); 
}; 

} // namespace Lib 
+1

यह एक बुरा विचार हो सकता है, क्योंकि इसका मतलब है कि यदि बी को पूर्ण रूप से ए में परिवर्तित किया जा सकता है लेकिन ए का उप-वर्ग नहीं है, तो ए + बी काम करता है, लेकिन बी + ए भ्रमित नहीं करता है। बेशक यह जरूरी नहीं है, उदाहरण के लिए यदि आपके घर की शैली उपयोगकर्ता द्वारा परिभाषित प्रकारों के बीच अंतर्निहित रूपांतरण पर प्रतिबंध लगाती है। –

+1

मैं सहमत हूं: समस्या है कि ए + बी काम करता है, लेकिन बी + ए नहीं (कहें ए एक जटिल संख्या अनुकरण करने वाला वर्ग है, और बी एक int)। एक और समस्या यह है कि एक गैर मित्र ऑपरेटर + कार्य कक्षा के encapsulation में वृद्धि, जबकि कक्षा विधि इसे कम करता है। – paercebal

15

यह पुस्तकालय नेम स्पेस में लाना Koenig lookup की वजह से काम करता है:

वास्तव में, यदि आप अपने वर्ग परिभाषा में अपने भार के परिभाषित करते हैं, यह एक विवादास्पद सवाल बन जाता है।

+1

वास्तव में कोइंग लुक-अप बिल्कुल बनाया गया था ताकि आप फ़ंक्शन को लिब नेमस्पेस के अंदर रख सकें, और फिर भी इसे ओवरलोड लोड कर दिया जा सके। असाधारण सी ++ आइटम 31-32 देखें। – tenpn