هل يمكن لمشغلي المهام C ++ أن يكونوا وظائف مجانية؟
-
28-09-2019 - |
سؤال
أحاول شيئًا كهذا:
Foo & operator=(Foo & to, const Bar &from);
لكني أتلقى هذا الخطأ:
E2239 'operator =(Foo &, const Bar &)' must be a member function
هل هناك قيود على المشغلين التي يمكن/لا يمكن تعريفها على أنها وظائف مجانية ، وإذا كان الأمر كذلك ، فلماذا؟
المحلول
يجب أن يكون مشغل الواجب وظيفة عضو غير منتظمة ويجب أن يكون لها معلمة واحدة بالضبط:
يجب تنفيذ مشغل الواجب بواسطة وظيفة عضو غير قاسية مع معلمة واحدة بالضبط (C ++ 03 13.5.3/1).
operator()
, operator[]
, ، و operator->
يجب أيضًا تنفيذها كوظائف عضو غير منتظمة.
طبقة محددة operator new
و operator delete
(والمتغيرات منها) يجب تنفيذها كوظائف الأعضاء الثابتة (لاحظ أن هذه هي ثابتة ضمنية ، حتى لو لم يتم إعلانها مع static
الكلمة الرئيسية).
نصائح أخرى
لا تستطيع.
السبب ، على ما أعتقد ، له علاقة بمنشئ النسخ. لديهم دلالات متشابهة للغاية ، ولا يمكنك تحديد مُنشئ النسخ خارج الفصل تمامًا مثل مُنشئ آخر. لذلك ، لم يرغبوا في فصل التوأم بعيدًا (لتجنب المفارقة التوأم :).
ملاحظة: ما هو العار في C ++ ، هو أنه لا يمكنك إضافة عضو إلى الفصل الحالي. لا يوجد سبب منخفض المستوى لذلك. إذا كان ذلك ممكنًا ، فيمكنك فصل تبعيات الرأس و CPP من خلال عدم إعلان الوظائف الخاصة في رأس تعريف الفصل.