10

this धागे के उत्तरों के अनुसार, operator= गैर-सदस्य फ़ंक्शन के रूप में अधिभारित नहीं किया जा सकता है।ओवरलोडिंग ऑपरेटर = गैर-सदस्य

class MyClass 
{ 
    // ... 
}; 

MyClass& operator=(MyClass& Left, MyClass& Right) 
{ 
    // ... 
} 

ऐसा क्यों है: तो, उदाहरण के लिए, निम्नलिखित संकलक बहुत गुस्से में है? मेरे पास गेटर्स और सेटर्स के साथ एक कंटेनर क्लास है, इसलिए एक सदस्य फ़ंक्शन अनावश्यक है और यह encapsulation तोड़ देगा। उपर्युक्त धागे के उत्तरों में से एक ने कहा कि यह सुनिश्चित करना है कि "एल-वैल्यू अपने पहले ऑपरेंड के रूप में प्राप्त हुआ है," लेकिन मैं इसका अर्थ समझ नहीं पा रहा हूं। क्या कोई स्पष्टीकरण दे सकता है?

इसके अतिरिक्त, operator=, operator(), operator[] और operator-> "oddball" के मामले हैं ...? या मुझे सदस्य कार्यों के रूप में सभी अधिभारित ऑपरेटरों को लागू करना चाहिए ...? (मुझे पता है कि यह अन्यथा करने के लिए पूरी तरह से कानूनी है, लेकिन मैं बेहतर अभ्यास की तलाश में हूं।)

+1

यह थ्रेड भी देखें http://stackoverflow.com/questions/3938036/rationale-of-enforcing-some-operators-to-be-members – UmmaGumma

+0

मुझे लगता है कि गेटर्स/सेटर्स एक असाइनमेंट ऑपरेटर से अधिक encapsulation तोड़ते हैं। नोट: यदि आप एक परिभाषित नहीं करते हैं तो आपकी कक्षा में पहले से ही एक असाइनमेंट ऑपरेटर है। कोशिश करो। –

+0

सदस्य कार्य encapsulation तोड़ नहीं है; वे इसका एक हिस्सा हैं। "गैर-सदस्य, गैर-मित्र कार्य" बनाने की वरीयता के परिणामस्वरूप सरल वर्ग हो सकते हैं, लेकिन सामान्य स्थिति में, ऑपरेटर =() को लागू करने के लिए आवश्यक सभी चीज़ों को उजागर करने से ऑपरेटर =() को सदस्य बनाने की तुलना में encapsulation कमजोर होने की संभावना अधिक होती है। –

उत्तर

6

यदि आपकी कक्षा में असाइनमेंट ऑपरेटर (सदस्य के रूप में) नहीं है, तो संकलक डिफ़ॉल्ट रूप से एक उत्पन्न करता है, जैसे यदि आप एक प्रदान नहीं करते हैं तो यह एक कॉपी कन्स्ट्रक्टर उत्पन्न करता है।

इसलिए यदि आप बाद में गैर-सदस्य असाइनमेंट ऑपरेटर को परिभाषित करने का प्रयास करते हैं तो यह "गुस्सा" होगा। तब दो होंगे!

+0

नियम को गैर-सदस्य खोजने का प्रयास करने के लिए बस बदला जा सकता है एक पहला। – GManNickG

+0

@GMan क्या होगा अगर गैर-सदस्य ऑपरेटर किसी अन्य अनुवाद इकाई में है? एक ओडीआर उल्लंघन? –

+0

@ बो: उचित लगता है। – GManNickG

1

यह क्यों है?

जब तक आप एक घोषित, संकलक हस्ताक्षर operator= (C&, C&) या operator= (C&, const C&) साथ अपनी कक्षा में एक operator= की घोषणा की।

यदि आपको असाइनमेंट अधिभारित करने की अनुमति थी, तो अधिकांश उपयोग संदिग्ध होंगे।

तो आप की संभावना अतिरिक्त नियमों के के लिए लॉबी या तो:

  • बहाना नहीं संकलक घोषित operator= यदि कोई उपयोगकर्ता घोषित एक दिखाई दे रहा है, जैसे कि गैर-सदस्य operator= सदस्य छुपाता है operator=
  • अपने उपयोगकर्ता को ओवरलोडिंग के दौरान एक बेहतर मैच असाइनमेंट घोषित कर देता है।

दोनों विकल्प नियमों को जटिल करेंगे जो पहले से ही जटिल हैं, केवल operator= के लिए एक विशेष मामला जोड़ना।

कुछ लोग वहां जाना चाहते हैं।

और आपने इस सुविधा के लिए वैध उपयोग नहीं किया है।

या, कोई भी उचित उपयोग बिल्कुल भी।

सी ++ नियम केवल तब भी जटिल होते हैं जब कुछ उचित उपयोग-मामले दिखाए जा सकते हैं।

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