سؤال

أنا أكتب فصلًا ، وجاء هذا الشك. هل هذا undef. سلوك؟ من ناحية أخرى ، لست متأكدًا من الموصى به ، أو إذا كانت ممارسة جيدة. هل هو واحد إذا لم أتأكد من عدم إلقاء استثناءات في وظيفة init؟

//c.h
class C{

    float vx,vy;
    friend void init(C& c);
public:
    C();

};


//c.cpp
C::C()
{
   init(*this);
}

void init(C& c) //throws() to ensure no exceptions ?
{
  c.vx = 0;
  c.vy = 0;
}

شكرا مقدما

هل كانت مفيدة؟

المحلول

إنه جيد تمامًا. بمجرد دخول جسم المنشئ ، تمت تهيئة جميع الأعضاء وهم مستعدون للاستخدام. (يجب أن ينهي الجسم أي عمل آخر يجب القيام به لإنشاء كائن تم إنشاؤه بالكامل.)

لكنه أسلوب ضعيف. الأفضل هو فقط:

C::C() :
vx(), vy() // or vx(0), vy(0) if you prefer to be explicit
{}

وتخلص من كل الفوضى.


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

نصائح أخرى

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

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

لا يزال السلوك غير محدد على الرغم من ذلك - فقط السلوك المحدد :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top