पृष्ठभूमि: मैं कई चर के साथ एक जटिल वर्ग की है।क्या मैं ऑपरेटर = में प्लेसमेंट नया (यह) उपयोग कर सकता हूं?
Applepie::Applepie(const Applepie ©) :
m_crust(copy.m_crust),
m_filling(copy.m_filling)
{
}
सदस्य चर प्रति कंस्ट्रक्टर्स intializer सूची में कहा जाता है में से कुछ आवंटन करते हैं: मैं एक ध्वनि और परीक्षण प्रतिलिपि निर्माता है।
प्रश्न: मुझे operator=
बनाने की आवश्यकता है। बल्कि काम के बजाय प्रारंभ सूची, और मुक्त कराने स्मृति मौजूदा constuctor कि प्रतिस्थापित किया जा रहा है डुप्लिकेट, और आदि आदि आदि, मैं बस निम्न कर सकते हैं की तुलना में:
Applepie& Applepie::operator=(const Applepie ©)
{
if(this != ©)
{
this->~Applepie(); // release own object
new(this) Applepie(copy); // placement new copy constructor
}
return *this;
}
दूसरे शब्दों में, एक प्लेसमेंट के बाद स्वयं को नष्ट है नई प्रतिलिपि कन्स्ट्रक्टर semantically ऑपरेटर के समान =?
इस क्षमता में नाटकीय रूप से बार-बार कोड और पुष्टि है कि प्रत्येक चर ठीक से प्रारंभ होता है, काम के दौरान दक्षता के संभावित मामूली नुकसान की कीमत पर कम करने के लिए लगता है। क्या मुझे कुछ और अस्पष्ट याद आ रही है?
तर्क: मेरी वास्तविक कक्षा में लगभग 30 varaibles हैं। मैं इस तथ्य से चिंतित हूं कि मेरी प्रतिलिपि निर्माता और मेरे असाइनमेंट ऑपरेटर दोनों को तीस तीस की प्रतिलिपि बनाना है, और कोड अलग हो सकता है, जिससे दोनों परिचालन अलग-अलग काम कर सकते हैं।
प्रतिलिपि ctor फेंकता है, तो आप वस्तु हड्डी टूट गई है, तो आप किसी भी expection सुरक्षा की गारंटी देता है दे रही है नहीं कर रहे हैं। –
@ आर मार्टिनो - मुझे ऐसा लगता है कि कॉपी सीटीर फेंकने वाली किसी भी स्थिति से मेरा ऑपरेटर = फेंकने का कारण बनता है अगर मैं प्रत्येक चर को मैन्युअल रूप से असाइन कर रहा था ... तो ... यह अभी भी बराबर लगता है? – jcwenger
समस्या 'ऑपरेटर =' फेंकना नहीं है, 'ऑपरेटर =' ऑब्जेक्ट को अमान्य स्थिति में छोड़ रहा है! यह नष्ट हो गया है। –