9

मेरे पास एक उपयोग केस है कि मेरी वस्तु को किसी भी तरह से कॉपी नहीं किया जाना चाहिए। मैंने कॉपी कन्स्ट्रक्टर की एक अतिरंजित पूर्ण सूची और नीचे असाइनमेंट ऑपरेटर हटाने की प्रतिलिपि लिखी है। उनमें से बहुत सारे हैं कि मैं यह सुनिश्चित नहीं कर सकता कि किन लोगों का उपयोग करना है, और कभी-कभी यह मुझे पागल बनाता है। मुझे उन्हें अपने कोड में लिखना नहीं है, क्या मैं? तो, किसी भी प्रकार की वस्तु प्रतिलिपि को रोकने के लिए, उनमें से किस का उपयोग करना चाहिए?कॉपी कन्स्ट्रक्टर को हटाने और असाइनमेंट ऑपरेटरों की प्रतिलिपि बनाएँ। उनमें से कौन सा जरूरी है?

 MyClass    (  MyClass &) = delete; 
     MyClass    (const MyClass &) = delete; 
     MyClass    (  MyClass &&) = delete; 
     MyClass    (const MyClass &&) = delete; 
     MyClass operator=(  MyClass &) = delete; 
     MyClass operator=(const MyClass &) = delete; 
const MyClass operator=(  MyClass &) = delete; 
const MyClass operator=(const MyClass &) = delete; 
     MyClass & operator=(  MyClass &) = delete; 
     MyClass & operator=(const MyClass &) = delete; 
const MyClass & operator=(  MyClass &) = delete; 
const MyClass & operator=(const MyClass &) = delete; 
     MyClass && operator=(  MyClass &) = delete; 
     MyClass && operator=(const MyClass &) = delete; 
const MyClass && operator=(  MyClass &) = delete; 
const MyClass && operator=(const MyClass &) = delete; 
     MyClass operator=(  MyClass &&) = delete; 
     MyClass operator=(const MyClass &&) = delete; 
const MyClass operator=(  MyClass &&) = delete; 
const MyClass operator=(const MyClass &&) = delete; 
     MyClass & operator=(  MyClass &&) = delete; 
     MyClass & operator=(const MyClass &&) = delete; 
const MyClass & operator=(  MyClass &&) = delete; 
const MyClass & operator=(const MyClass &&) = delete; 
     MyClass && operator=(  MyClass &&) = delete; 
     MyClass && operator=(const MyClass &&) = delete; 
const MyClass && operator=(  MyClass &&) = delete; 
const MyClass && operator=(const MyClass &&) = delete; 
+0

यह वास्तव में थोड़ा सा भयावह देखता है :) – melak47

+4

यह संकलित नहीं होगा, क्योंकि आप वापसी मूल्य पर अधिभार नहीं कर सकते हैं। – interjay

+3

इसके अलावा, आप 'अस्थिर' भूल गए ;-) –

उत्तर

15

आपको केवल एक प्रतिलिपि कन्स्ट्रक्टर को चिह्नित करने और delete के रूप में असाइनमेंट ऑपरेटर की प्रतिलिपि बनाने की आवश्यकता है। प्रतिलिपि संस्करणों की उपस्थिति चालक कन्स्ट्रक्टर की अंतर्निहित घोषणा को रोकती है और असाइनमेंट ऑपरेटर ले जाती है, और एक प्रतिलिपि विशेष सदस्य फ़ंक्शन का एक रूप घोषित करने से अन्य रूपों की निहित घोषणा की जाती है।

MyClass (const MyClass&) = delete; 
MyClass& operator= (const MyClass&) = delete; 

ध्यान दें कि बाद सी ++ 11, असाइनमेंट ऑपरेटर की अंतर्निहित परिभाषा के रूप में चूक बहिष्कृत हो गई है और यह बजाय के रूप में नष्ट परिभाषित किया जाना चाहिए।

+1

बस एक बहुत मामूली नाइटपिक, और मैं गलत हो सकता है। * परिभाषा * बहिष्कृत नहीं है, न कि * घोषणा *? उन्हें हमेशा घोषित किया जाता है, लेकिन उनकी परिभाषा हटा दी जाती है। लेकिन मैं एक बहुत अच्छी भाषा वकील नहीं हूँ। – luk32

+0

@ luk32 आह, आप सही हैं, इसे बदले में घोषित रूप से घोषित और परिभाषित किया जाना चाहिए, ('[class.copy]/18'), धन्यवाद। – TartanLlama

3

copy constructor

MyClass    (const MyClass &) = delete; 

assignement operator

MyClass & operator=(const MyClass &) = delete; 

ये केवल प्रतिलिपि कंस्ट्रक्टर्स ans कॉपी assignement ऑपरेटरों परोक्ष परिभाषित कर रहे हैं।

+2

'ऑपरेटर =' एक निर्माता नहीं है; और सामान्य रूप से अन्य रचनाकारों को स्पष्ट रूप से परिभाषित किया जा सकता है - लेकिन उपयोगकर्ता द्वारा परिभाषित 'माइक्लास (कॉन्स माई क्लास एंड)' की उपस्थिति अन्य रचनाकारों को दबा देती है। –

+3

आपका "समाधान" अच्छा है लेकिन उत्तर वास्तव में गलत है। उचित तर्क यह है कि सभी असाइनमेंट ऑपरेटरों और रचनाकारों को स्पष्ट रूप से परिभाषित किया जाता है जब तक कि अन्य कारणों से आप एक हाथ से परिभाषित नहीं करते हैं। इस उद्देश्य के लिए परिभाषा परिभाषा के रूप में गिना जाता है। – luk32

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

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