2010-01-31 18 views
22

सी ++ की आवश्यकता क्यों है कि उपयोगकर्ता द्वारा परिभाषित रूपांतरण ऑपरेटर केवल गैर स्थैतिक सदस्य हो सकता है? अन्य यूनरी ऑपरेटरों के लिए स्टैंडअलोन फ़ंक्शंस का उपयोग करने की अनुमति क्यों नहीं है? कुछ इस तरह:रूपांतरण ऑपरेटर स्टैंडअलोन फ़ंक्शन के रूप में

operator bool (const std::string& s) { return !s.empty(); } 

उत्तर

6

एक कारण मैं के बारे में सोच सकते हैं अंतर्निहित रूपांतरण बात डाली जा रहा है करने के लिए लागू किया जा रहा रोकने के लिए है। अपने उदाहरण में, यदि आप ने कहा:

bool("foo"); 

तो "foo" परोक्ष एक स्ट्रिंग है, जो तब स्पष्ट bool रूपांतरण आप इसे करने के लिए लागू होता था करने के लिए परिवर्तित किया जाएगा।

यह संभव नहीं है कि बूल ऑपरेटर सदस्य कार्य है, क्योंकि निहित रूपांतरण *this पर लागू नहीं होते हैं। यह अस्पष्टता के लिए संभावनाओं को बहुत कम करता है - अस्पष्टताओं को आम तौर पर "बुरी चीज" के रूप में देखा जा रहा है।

+0

मुझे आपकी तर्क समझ में नहीं आ रही है। आपके द्वारा दिया गया उदाहरण एक निहित रूपांतरण नहीं है। दूसरी ओर एक रूपांतरण ऑपरेटर को परिभाषित करने का मुख्य कारण अंतर्निहित रूपांतरण का उपयोग करना है। – shura

+0

@ शूरा हां यह है। "foo" को पूरी तरह से एक स्ट्रिंग में परिवर्तित किया जा रहा है, जिसे स्पष्ट रूप से एक बूल में परिवर्तित किया जाता है। मैंने इसे स्पष्ट करने के लिए अपना उत्तर अपडेट कर दिया है। –

+0

नील, अब मैं आपका बिंदु देखता हूं। – shura

0

कक्षा के भीतर रूपांतरण ऑपरेटर को रखकर आप इसे नियंत्रित करने के तरीके के वर्ग नियंत्रण के लेखक को देते हैं (यह उपयोगकर्ताओं को अंतर्निहित रूपांतरण बनाने से रोकता है)। एक कार्यान्वयनकर्ता के रूप में, मैं इसे एक लाभ मानता हूं, implicit conversions does have its issues

एक ऑब्जेक्ट को दूसरे के रूप में पारित करने में सक्षम होने और एक रूपांतरण फ़ंक्शन के माध्यम से जाने में कोई अंतर होता है। पूर्व संचार करता है कि वस्तु किसी दिए गए प्रकार का है, जबकि उत्तरार्द्ध नए पाठकों को दिखाता है कि दो प्रकारों के बीच एक अंतर है और रूपांतरण आवश्यक है।

+1

यह कोई अतिरिक्त नियंत्रण नहीं देता है। मैं रूपांतरण करने के लिए (और शायद चाहिए) बस एक ToBool() फ़ंक्शन लिख सकता हूं। –

+0

यह भी करता है :) लागू रूपांतरण एक ToBool() से काफी अलग है। अगर मैं कर सकता हूं तो मैं std :: स्ट्रिंग को char * में परिवर्तनीय रूप से परिवर्तनीय बनाउंगा, लेकिन सौभाग्य से स्ट्राउस्ट्रप एट अल। बेहतर जानता था। – daramarak

-2

ऑपरेटरों का एक समूह है जिसे गैर स्थैतिक सदस्य कार्यों के रूप में ओवरलोड किया जाना है: असाइनमेंट, सबस्क्रिप्टिंग, फ़ंक्शन कॉल, क्लास सदस्य एक्सेस, रूपांतरण फ़ंक्शन।

मुझे लगता है कि मानक समिति या स्ट्रॉस्ट्रप बस महसूस किया कि यह बहुत भ्रमित हो सकता है अगर इसे बाहर से कक्षाओं के लिए इन विशेष व्यवहारों को इंजेक्ट करने की अनुमति दी गई हो।


मुझे लगता है कि उत्तर पाने का सबसे अच्छा तरीका लेखक को ई-मेल करना होगा।

+0

उम, मानकों की समिति पहली बार पहली बार मिलने से पहले यह तय नहीं किया गया था? – sbi

+0

या शायद स्ट्रॉस्ट्रप इस तरह महसूस किया। यह केवल एक अटकलें है। इन सभी में क्या समान है, इसलिए उन्हें सभी सदस्य होना चाहिए? मुझे कोई तकनीकी कारण नहीं दिख रहा है, उन्हें क्यों चाहिए (ठीक है, असाइनमेंट में तकनीकी समस्या होगी, क्योंकि संकलक अन्यथा इसे संश्लेषित करेगा)। – UncleBens

+0

उदास क्योंकि "std :: string से" अन्य चीजों में कनवर्ट करना एक सामान्य इच्छा –

-3

लागू उपयोगकर्ता परिभाषित रूपांतरण किसी भी तरह से फंस गए हैं। उनका उपयोग न करें। बस दिखाओ कि वे वहां नहीं हैं। अकेले उन्हें पेश करने के नए तरीकों के बारे में सोचने दें।

वैसे भी, मुझे लगता है कि वे वहां नहीं हैं क्योंकि वे जिस तरह से हैं वे पर्याप्त अप्रत्याशित चीजें कर सकते हैं। एक नया हेडर भी शामिल है जो कहीं और परिभाषित कक्षा के लिए इस तरह के रूपांतरण को पेश करता है और इससे भी अधिक भ्रमित त्रुटियों का कारण बन सकता है।

+1

+1 है हालांकि मैं कहूंगा कि उपयोगकर्ता/परिभाषित // '। –

+0

तो जब सी ++ 0x कास्ट ऑपरेटरों के साथ 'स्पष्ट' का उपयोग करने की अनुमति देता है, तो क्या आपका तर्क अभी भी है? मैं कास्ट ऑपरेटरों को फ्रीस्टैंड करने के लिए कुछ उपयोगीता का अनुमान लगा सकता हूं जिसका उपयोग केवल 'static_cast' के साथ किया जा सकता है। – jamesdlin

+0

यह नहीं कि मैं निहित उपयोगकर्ता द्वारा परिभाषित रूपांतरण का एक बड़ा प्रशंसक हूं। मैं कभी भी उदाहरण के रूप में स्ट्रिंग को बूल में परिवर्तित नहीं करना चाहता हूं। लेकिन कभी-कभी वे उपयोगी होते हैं। उदाहरण के लिए std :: string (const char *) लें। – shura

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