سؤال

على سبيل المثال هذا صحيح:

class C 
{
   private: 
     C();
     C(const & C other);
}

أو يجب عليك تفضل تقديم تعريف (ق):

class C 
{
   private: 
     C() {};
     C(const & C other) {};
}

ب شكرا على الإجابات الحالية. دعونا تمديد هذا السؤال - هل ينشئ المحول البرمجي رمز أفضل في إحدى هذه الأمثلة؟ أستطيع أن أتخيل أن توفير جسم مترجم قوات المحاسبين لتضمين بعض الكود (فارغ) في وحدة الترجمة؟ هل هذا صحيح أيضا للحصول على التعليمات البرمجية التي تم إنشاؤها تلقائيا؟

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

المحلول

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

نصائح أخرى

من الجيد طالما أنك لا تستخدمها.

مع معيار 0x يمكنك استخدام وظائف محذوفة.

class X {
   // ...
   X& operator=(const X&) = delete; // Disallow copying
   X(const X&) = delete;
};

يمكنك استخدام منشئين الإعلانات فقط للوصول إلى الإنشاءات المعطاة، مثل البناء القياسي، أو بناء النسخ.

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

حول برنامجك الأخير الخاص بك: كنت أتوقع وجود مترجم لائق لإنتاج نفس التعليمات البرمجية لمنشئ افتراضي وبناء فارغ وليس قائمة التهيئة، في النهاية، ما يجب القيام به هو التهيئة الافتراضية لكل عضو.

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

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

أولا، إذا كنت ترغب في جعل فصلك غير قابل للاسترداد تماما، فلا تنفذ منشئ النسخ الخاص ومشغل التعيين. وإلا فإنه لا يزال من الممكن أن يتمكن جزء من التعليمات البرمجية التي يمكن الوصول إليها (طريقة أو صديق) بصمت نسخ. بدون التنفيذ، ستحصل على خطأ رابط.

ومع ذلك، فإن خطأ مترجم سيكون أفضل، كما ستكتشف الخطأ بشكل أسرع. لهذا هناك boost::noncopyable, ، أو يمكنك أن تستمد من فئة قاعدة تخفي إنه نسخ منشئ ومشغل التعيين.

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

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

سوف تحتاج إلى تقديم تعريفات. إذا لم تقم بذلك، وتحاول استخدامها، فسوف تفشل في الارتباط.

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

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