यह एक गंदा हैक है, लेकिन आप को नष्ट करने और अपने आप को फिर से संगठित कर सकते हैं:
MyItemT&
MyItemT::operator=(const MyItemT& other)
{
if (this == &other) return *this; // "suggested" by Herb Sutter ;v)
this->MyItemT::~MyItemT();
try {
new(this) MyItemT(other);
} catch (...) {
new(this) MyItemT(); // nothrow
throw;
}
return *this;
}
संपादित करें: ऐसा न हो कि मैं अपने विश्वसनीयता को नष्ट, मैं वास्तव में इस अपने आप ऐसा नहीं करते हैं, मैं const
को दूर करेंगे। हालांकि, मैं इस अभ्यास को बदलने पर बहस कर रहा हूं, क्योंकि const
जहां भी संभव हो, उपयोग करने के लिए बस उपयोगी और बेहतर है।
कभी-कभी किसी ऑब्जेक्ट द्वारा प्रदत्त संसाधन और मूल्य के बीच एक अंतर होता है। जब तक संसाधन समान होता है तब तक एक सदस्य मूल्य में परिवर्तनों के माध्यम से हो सकता है, और उस पर संकलन-समय सुरक्षा प्राप्त करना अच्छा लगेगा।
संपादित करें 2: @ चार्ल्स बेली ने यह अद्भुत (और अत्यधिक महत्वपूर्ण) लिंक प्रदान किया है: http://gotw.ca/gotw/023.htm।
- किसी भी व्युत्पन्न वर्ग
operator=
में सेमेन्टिक्स मुश्किल हैं।
- यह अक्षम हो सकता है क्योंकि यह असाइनमेंट ऑपरेटरों को नहीं बुलाता है जिन्हें परिभाषित किया गया है।
- यह wonky
operator&
भार के (जो)
- आदि
संपादित 3 के साथ असंगत है: बनाम "क्या मूल्य" भेद "जो संसाधन" के माध्यम से सोच रही थी, यह स्पष्ट लगता है कि operator=
हमेशा चाहिए परिवर्तन मूल्य और संसाधन नहीं। संसाधन पहचानकर्ता const
हो सकता है। उदाहरण में, सभी सदस्य const
हैं। यदि "जानकारी" है जो "पैकेट" के अंदर संग्रहीत है, तो शायद पैकेट const
और जानकारी नहीं होनी चाहिए।
तो समस्या इस उदाहरण में स्पष्ट मूल्य की कमी के रूप में असाइनमेंट के अर्थशास्त्र को इतनी अधिक नहीं लग रही है, अगर "जानकारी" वास्तव में मेटाडेटा है। यदि किसी भी वर्ग के पास MyItemT
है, तो इसे एक पैकेट से दूसरे में स्विच करना चाहता है, इसे छोड़कर auto_ptr<MyItemT>
का उपयोग करना चाहिए या उपरोक्त के समान ही हैक (पहचान परीक्षण अनावश्यक है लेकिन catch
शेष) लागू किया गया है के बाहर।लेकिन operator=
को एक अतिरिक्त विशेष सुविधा के अलावा संसाधन बाध्यकारी को नहीं बदला जाना चाहिए जो बिल्कुल किसी और के साथ हस्तक्षेप नहीं करेगा।
ध्यान दें कि यह सम्मेलन असाइनमेंट के मामले में कॉपी निर्माण को लागू करने के लिए सटर की सलाह के साथ अच्छा प्रदर्शन करता है।
MyItemT::MyItemT(MyItemT const &in)
: mMyPacket(in.mMyPacket) // initialize resource, const member
{ *this = in; } // assign value, non-const, via sole assignment method
यदि आपकी कक्षा असाइन करने योग्य है और उन सदस्यों को बदला जा सकता है, तो 'const' को हटा दें। यह बस समझ में नहीं आता है। – GManNickG
@GMan - मुझे लगता है कि आप सही हैं। मैं किसी तरह के मित्र-जैसा दृष्टिकोण की तलाश में था जो 'ऑपरेटर =' को विशेष विशेषाधिकार रखने की अनुमति देता है, जो अभी भी सदस्यों को मैन्युअल रूप से ओवरराइड होने से रोकता है। लेकिन @MichaelMrozek ने क्या कहा, यह पढ़ने के बाद, यह वास्तव में बिल्कुल सुरक्षित नहीं है। – LeopardSkinPillBoxHat