অ্যাসাইনমেন্ট অপারেটর (operator=) ঠিকমতো ইমপ্লিমেন্ট করা কঠিন (সেলফ-অ্যাসাইনমেন্ট, এক্সসেপশন সেফটি, রিসোর্স লিক)। Copy-and-Swap Idiom এর সমাধান।
আইডিয়াম
- কপি-কনস্ট্রাক্টর দিয়ে লোকাল কপি বানান (নতুন স্টেট) - এক্সসেপশন হলে অরিজিনাল অবজেক্ট অপরিবর্তিত থাকে।
swap()ফাংশন দিয়ে পুরানো ডেটা এবং নতুন ডেটা এক্সচেঞ্জ করুন (নো-থ্রো গ্যারান্টি)।- লোকাল অবজেক্ট (পুরানো স্টেট ধারণকারী) স্কোপ বাইরে গিয়ে ডিস্ট্রয় হয়ে রিসোর্স মুক্ত করে।
প্রয়োজনীয় তিনটি জিনিস
- কপি-কনস্ট্রাক্টর
- ডিস্ট্রাক্টর
swap()ফাংশন (নো-থ্রো, মেম্বার-বাই-মেম্বার swap)
ইমপ্লিমেন্টেশন
class MyClass {
int* data;
size_t size;
// ... কনস্ট্রাক্টর, ডিস্ট্রাক্টর, কপি কনস্ট্রাক্টর
void swap(MyClass& other) noexcept {
std::swap(data, other.data);
std::swap(size, other.size);
}
public:
MyClass& operator=(MyClass other) { // Pass by value! (কপি হয়)
swap(other); // Swap করলে *this নতুন স্টেট পায়
return *this; // other (পুরানো স্টেট) ডিস্ট্রয় হয়ে মেমরি মুক্ত করে
}
};
সুন্দর দিক: পাস-বাই-ভ্যালু প্যারামিটার কপি-কনস্ট্রাক্টর কল করে। swap নো-থ্রো। সেলফ-অ্যাসাইনমেন্ট অটোমেটিক্যালি হ্যান্ডল হয়। স্ট্রং এক্সসেপশন সেফটি।
সতর্কতা: std::swap ব্যবহার করবেন না (সেটি কপি/অ্যাসাইনমেন্ট ব্যবহার করে)। নিজের swap লিখুন।