سؤال

أنا أكتب ليب ومشروع تجريبي.لا يهتم المشروع بإصدار lib الذي أستخدمه (يمكنني استخدام sdl أو directx أو أي شيء أحبه كواجهة خلفية لـ gfx).للحصول على الكائن الذي أفعله

Obj *obj = libname_newDevice();

الآن، هل يجب علي استخدام الحذف أم يجب أن أفعل ذلك obj->deleteMe();؟أسأل لأنني لا أقوم بعمل جديد تمامًا لذا لا ينبغي أن أقوم بالحذف؟

أملك obj->create(theType); الذي يقوم بإرجاع فئة مع واجهة Obj.سؤالي الحقيقي هو هل أحتاج إلى libname_deleteDevice(); أو هو obj->deleteMe() بخير لأن لدي حذف في الواجهة؟

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

المحلول

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

class ObjWrap
{
    public:
        ObjWrap()
            :obj(libname_newDevice())
        {}
        ~ObjWrap()
        {    libname_deleteDevice(obj);}
    private:
        ObjWrap(ObjWrap const&);        // Dont copy
        void operator=(ObjWrap const&); // Dont copy
        Obj* obj;
}; // If you want to copy then you need to extra work on ref counting
   // This may need some form of smart pointer.

نصائح أخرى

ومنذ كنت التلخيص خلق داخل libname_newDevice() (التي يجب أن أقول ليس نهج جيد)، يجب تدمير استخدام شيء من هذا القبيل libname_destroyDevice (obj).

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

من فضلك حاول توضيح سؤالك.الأمر غير واضح تمامًا بالنسبة لي.

  • لماذا تتحدث عن الواجهة الخلفية الرسومية؟هل له علاقة بالسؤال؟
  • هل تسأل كيف يجب أن تصمم مكتبتك أو كيف يجب أن تستخدمها؟

من الممارسات الجيدة أن يكون لديك مصنع كائنات لإنشاء الكائن.أعتقد أن هذا هو دور libname_newDevice().

يجب أن توفر المكتبة أيضًا طريقة لحذف الكائن (مثل obj->DeleteMe() أو libname_Delete(obj) ).

لا تعتمد على لغة C++ delete:ربما تم تجميع المتصل والمكتبة باستخدام إصدار مختلف من المترجم، والذي من شأنه أن يفعل أشياء مختلفة فيما يتعلق بتخصيص الذاكرة والموارد.لذلك يكون الأمر أكثر أمانًا إذا قام lib الخاص بك بحذف الكائن الذي أنشأه.

وأعتقد أن أفضل طريقة ليكون تكريم RAII وبعض وجوه المجمع حساب مرجع (يمكنك حتى استخدام shared_ptr مع deallocator مخصصة ).

وأنت بالتأكيد لا تريد تنفيذ الكائنات :: deleteMe (). فإنه سيتعين عليها أن تفعل شيئا مثل:

delete this;

وبينما كنت ما زلت داخل هذا-> deleteMe (). اتبع اقتراح عابر الطريق بمخالفة وجعل وظيفة تدمير تأخذ على الكائنات * كمعلمة.

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