কম্পিউটার টিউটোরিয়াল

C++-এ Copy-and-Swap Idiom কী?

অ্যাসাইনমেন্ট অপারেটর (operator=) ঠিকমতো ইমপ্লিমেন্ট করা কঠিন (সেলফ-অ্যাসাইনমেন্ট, এক্সসেপশন সেফটি, রিসোর্স লিক)। Copy-and-Swap Idiom এর সমাধান।

আইডিয়াম

  1. কপি-কনস্ট্রাক্টর দিয়ে লোকাল কপি বানান (নতুন স্টেট) - এক্সসেপশন হলে অরিজিনাল অবজেক্ট অপরিবর্তিত থাকে।
  2. swap() ফাংশন দিয়ে পুরানো ডেটা এবং নতুন ডেটা এক্সচেঞ্জ করুন (নো-থ্রো গ্যারান্টি)।
  3. লোকাল অবজেক্ট (পুরানো স্টেট ধারণকারী) স্কোপ বাইরে গিয়ে ডিস্ট্রয় হয়ে রিসোর্স মুক্ত করে।

প্রয়োজনীয় তিনটি জিনিস

  • কপি-কনস্ট্রাক্টর
  • ডিস্ট্রাক্টর
  • 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 লিখুন।

  1. উইন্ডোজে C++-এর জন্য সেরা IDE কী? (আলাদা লেখা)

  2. C++-এ const কিওয়ার্ড কী?

  3. C++ শিখতে ভালো রিসোর্সগুলো কী?

  4. C++ প্রোগ্রামিং ল্যাঙ্গুয়েজের সুবিধা