الجمهور عامل جديد خاص مشغل حذف:الحصول على C2248 "لا يمكن الوصول إلى عضو خاص" عند استخدام جديدة

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

سؤال

فئة لديها طاقتها المشغلين new و delete. new هو الجمهور ، delete هو خاص.

عند إنشاء مثيل من هذه الفئة ، أحصل على الخطأ التالي:

pFoo = new Foo(bar)

example.cpp(1):خطأ C2248:'فو:مشغل حذف':لا يمكن الوصول إلى عضو خاص أعلن في فئة فو'

ولكن ليس هناك دعوة إلى delete هنا لذا ما يجري في العقل الملتوية مترجم?:)

  1. ما هو سبب الخطأ ؟
  2. هل من الممكن حل المشكلة دون اللجوء إلى أحد CreateInstance وظيفة ؟
هل كانت مفيدة؟

المحلول

عندما تفعل new Foo() ثم يحدث شيئين:أولا operator new هو الاحتكام إلى تخصيص الذاكرة ، ثم منشئ Foo ويسمى.إذا كان هذا منشئ يلقي, منذ كنت لا يمكن الوصول إلى الذاكرة المخصصة بالفعل ، C++ runtime سوف تأخذ الرعاية من ذلك عن طريق تمرير المناسب operator delete.لهذا السبب كنت دائما يجب أن تنفذ مطابقة operator delete كل operator new تكتب وهذا هو السبب في أنه يحتاج إلى أن يكون الوصول إليها.

كوسيلة للخروج هل يمكن أن تجعل كل منهم خاصة و الاحتجاج operator new من الأعضاء وظيفة (مثل create()).

نصائح أخرى

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

كما في C++ المعايير عندما يكون لديك الدرجة مع حيوي تخصيص الذاكرة و يتم رفع استثناء داخل منشئ ، ذاكرة أن يتحرر لتجنب تسرب الذاكرة.

هنا كنت قد حددت كنت تملك المشغل الجديد كما العامة ، ولكن حذف خاصة .

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

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

  • "1.ما هو سبب الخطأ؟"

    الهيئة الجواب هو جيد.

  • "2.هل من الممكن حل المشكلة دون اللجوء إلى عضو CreateInstance وظيفة؟"

    نعم.إنشاء الخاصة المدمر.

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

إذا كانت المكتبة الخاصة بك لا تستخدم الاستثناءات ، يمكنك تعطيل استثناءات من مترجم "-fno-الاستثناءات" ، ثم خطأ لن تظهر بعد الآن.(في Visual studio يقيم تحت عنوان "C/C++", "إنشاء رمز", "تمكين استثناءات C++" > "لا (-fno-الاستثناءات)")

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