لماذا يقوم مُنشئ النسخ باستدعاء المُنشئ الافتراضي للفئة الأخرى؟

StackOverflow https://stackoverflow.com/questions/1934961

  •  20-09-2019
  •  | 
  •  

سؤال

كنت أتساءل لماذا يحدث خطأ مثل هذا.

no matching function for call to 'Foo::Foo()'

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

لم أكن أعلم حتى أنه يجب أخذ المنشئ بعين الاعتبار.إذا كان الرمز يقول شيئًا مثل

bar = thing.bar; //

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

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

المحلول

إذا كنت لا تعرف منشئ، مترجم سيتم إنشاء منشئ افتراضي، ولكن إذا كنت قيام تعريف منشئ (مثل منشئ نسخة) مترجم <م> سوف لا توليد منشئ افتراضي، لذلك تحتاج إلى تعريف أن المنشئ للغاية.

نصائح أخرى

وهذا يبدو وكأنه كنت قد تعريف منشئ نسخة دون تحديد أي منشئ آخرين.

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

إذا، كما تقول، كنت تفعل "شيء من هذا القبيل

bar = thing.bar;

من المفترض أنه في جسم من نسخة فصلك - لذا فإن bar تتم تهيئة الحقل باستخدام المُنشئ الافتراضي للفئة الخاصة به أولاً، ثم يستخدم عامل تعيين تلك الفئة لهذا البيان.لو barيحتوي فصل دراسي على مُنشئ نسخة فقط، ولا يوجد مُنشئ افتراضي، ستحتاج إلى إضافة مُنشئ bar(thing.bar) بند قبل افتتاح نسخة فصلك { وقم بإزالة هذا التعيين (فكرة جيدة بشكل عام على أي حال، ولكنها إلزامية بموجب شرط "عدم وجود عامل افتراضي").

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