استدعاء وظيفة غير عضو على مثيل من قبل
-
27-09-2019 - |
سؤال
أنا أكتب فصلًا ، وجاء هذا الشك. هل هذا 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 أن يكون فئة أساسية ، فإن السماح بالإشارة إليها بالهروب إلى الوظائف غير الأعضاء قد يتسبب في مفاجأة. في الحالات الفئة الأساسية ، تكون مصممي الحالات أكثر خصوصية لأن الفئة المشتقة لم يتم بناؤها بعد ، وتدعو الوظائف الافتراضية الفئة الأساسية بدلاً من الفئة المشتقة. قد لا تتوقع وظائف غير الأعضاء الحصول على كائن في هذه الحالة ، ولأنهم لا يشبهون المُنشئين ، سيكون من السهل تقديم الأخطاء عن طريق نسيان ذلك.
لا يزال السلوك غير محدد على الرغم من ذلك - فقط السلوك المحدد :)