البرمجة

استثناءات قاعدة C.21 في C++

عند قراءتك لدليل CppCoreGuidelines الذي كتبه Bjarne Stroustrup، وجدت توجيهًا يتعارض مع تجربتي. القاعدة C.21 تتطلب ما يلي: إذا قمت بتعريف أو حذف أي عملية افتراضية، يجب عليك تعريف أو حذف جميع العمليات الافتراضية.

يعتبر تعريف الدوال الخاصة بالكائنات الافتراضية مرتبطًا بشكل وثيق بعضها ببعض، لذلك إذا كان هناك حاجة لجعل إحداها غير افتراضية، فمن المحتمل أن تحتاج الأخرى أيضًا إلى تعديل.

من تجربتي، الحالات الأكثر شيوعًا لإعادة تعريف العمليات الافتراضية هي الحالتين التاليتين:

  1. تعريف مُدمج افتراضي للمدمر الظاهري للسماح بالوراثة:
arduino
class C1 { ... virtual ~C1() = default; }
  1. تعريف مُدمج افتراضي للمُنشئ الافتراضي الذي يقوم ببعض التهيئة لأعضاء الكائن من نوع RAII:
c
class C2 { public: int a; float b; std::string c; std::unique_ptr<int> x; C2() : a(0), b(1), c("2"), x(std::make_unique<int>(5)) {} }

جميع الحالات الأخرى كانت نادرة في تجربتي.

ما رأيك في هذه الأمثلة؟ هل هي استثناءات من قاعدة C.21 أم من الأفضل تعريف جميع العمليات الافتراضية هنا؟ هل هناك استثناءات شائعة أخرى؟

المزيد من المعلومات

بالطبع! بما أن قاعدة C.21 توجه لتعريف أو حذف جميع العمليات الافتراضية إذا تم تعريف أو حذف أي منها، فهناك بعض الحالات الشائعة التي قد تكون استثناءات:

  1. المدمر الافتراضي للنسخ: قد ترغب في تعريف مدمر افتراضي للنسخ (operator=) إذا كان لديك كائن يحتوي على موارد ديناميكية مثل std::unique_ptr أو std::shared_ptr. في هذه الحالة، قد تحتاج أيضًا إلى تعريف مُنشئ نسخ للتعامل مع تهيئة الكائن الجديد بشكل صحيح.

  2. المُنشئ الافتراضي: في حالة وجود أعضاء في الكائن تحتاج إلى قيم افتراضية محددة، قد تحتاج إلى تعريف مُنشئ افتراضي.

  3. المُنشئ النسخي: إذا كانت لديك حاجة لإنشاء نسخ عميقة لكائناتك، فقد تحتاج إلى تعريف المُنشئ النسخي.

  4. المُنشئ المتحرك: في حالة استخدامك للموارد الديناميكية مع std::move، قد تحتاج إلى تعريف المُنشئ المتحرك.

  5. المدمر الظاهري الخالي من الإجراء: إذا كان لديك كائنات تنتمي إلى تسلسلات ترتيبية أو تحتاج إلى تنظيفات خاصة، قد تحتاج إلى تعريف مدمر ظاهري خالٍ من الإجراء (=default) أو بإجراء فارغ.

عمومًا، يجب على المطور أن يحلل حاجة كل كائن لتعريف أو حذف عملياته الافتراضية بناءً على تصميم الكود ومتطلباته الخاصة.

زر الذهاب إلى الأعلى