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

C++-এ রুল অফ থ্রি (Rule of Three) ব্যাখ্যা

C++-এ Rule of Three (বিগ থ্রি বা ল অফ বিগ থ্রি) হলো একটি নিয়ম: যদি কোনো ক্লাস নিচের তিনটি থেকে যেকোনো একটি এক্সপ্লিসিটলি ডিফাইন করে, তবে অবশ্যই তিনটিই এক্সপ্লিসিটলি ডিফাইন করা উচিত।

  1. ডিস্ট্রাক্টর (Destructor)
  2. কপি কনস্ট্রাক্টর (Copy Constructor)
  3. কপি অ্যাসাইনমেন্ট অপারেটর (Copy Assignment Operator)

এগুলো 스페সিয়াল মেম্বার ফাংশন। প্রোগ্রামার ডিফাইন না করলে কম্পাইলার ইমপ্লিসিট ভার্সন দেয়। কিন্তু যদি ক্লাসে ডাইনামিক্যালি এলোকেটেড রিসোর্স (পয়েন্টার) থাকে, তবে শ্যালো কপি (shallow copy) এর কারণে ডাবল ফ্রি (double free) বা করাপশন হয়। এটাই রুল অফ থ্রির কারণ।

সমস্যা উদাহরণ

class Numbers {
    int num;
    int* ptr;
public:
    Numbers(int n, int* p) {  // কনস্ট্রাক্টর
        num = n;
        ptr = new int[num];
    }
    ~Numbers() {              // ডিস্ট্রাক্টর
        delete ptr;
        ptr = NULL;
    }
    // কপি কনস্ট্রাক্টর ও কপি অ্যাসাইনমেন্ট নেই!
};

int main() {
    int arr[4] = {11,22,33,44};
    Numbers Num1(4, arr);
    Numbers Num2(Num1);  // ডিফল্ট কপি কনস্ট্রাক্টর কল হয়
    return 0;            // স্কোপ শেষে ডিস্ট্রাক্টর দুবার কল → double free error
}

আউটপুট: *** Error: double free or corruption *** Aborted

সমাধান

কপি কনস্ট্রাক্টর ও কপি অ্যাসাইনমেন্ট অপারেটর এক্সপ্লিসিটলি লিখুন যাতে ডিপ কপি (deep copy) হয়।

  1. স্ট্রিং কপি করার C++ প্রোগ্রাম (strcpy ব্যবহার করে এবং না করে)

  2. C++11-এ Rule of Five (পাঁচটি নিয়ম) কী?

  3. C++-এ Rule of Three vs Rule of Five পার্থক্য

  4. C++-এ রুল অফ থ্রি (Rule of Three) কী?