هل من الحكمة أن توفر الوصول إلى weak_ptr في مكتبة واجهة ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

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

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

ولكن أشعر بالذنب مما اضطر المستخدمين أن تكون معقولة.

هل من المقبول أن يكون مكتبة فضح weak_ptr's إلى الأجسام ؟ غيرها من المكتبات فعل هذا ؟

لقد لمحة هذه المكتبة الاستخدام في تطبيقات و قد وجدت لها أن تكون أيضا ذات المهام الحرجة لفضح weak_ptr حصرا.

سيكون من الحكمة أن يكون مطابقة وظائف API فضح إما إشارة أو أ weak_ptr أو أي كائن قادر على فضح weak_ptr إلى نفسه ؟

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

المحلول

إذا كان smart_ptrs هي بالفعل الوصول مباشرة إلى المكتبة المستخدمين ، ثم لقد حصلت على الوصول إلى weak_ptrs, ببساطة عن طريق المقابلة weak_ptr's منشئ.ولكن إذا كان smart_ptrs جميع الداخلية إلى المكتبة ، هذا هو قصة مختلفة.

في هذه الحالة أنصح السماح لكل كائن تمر بها weak_ptrs إلى نفسه ، بالإضافة إلى أي الوصول إلى المكتبة الخاصة بك تقدم.الذي يعطي المستخدمين الأكثر مرونة:إذا كانوا بحاجة weak_ptr, لديهم إمكانية الوصول الفوري إلى ذلك ؛ إذا كانوا بحاجة shared_ptr, يمكن بسهولة الحصول على ذلك ؛ و لو أنهم فقط بحاجة إلى الوصول إلى هدف في حد ذاته ، يمكن تجاهل المؤشرات الذكية تماما.

بالطبع, أنا لا أعرف ماذا المكتبة الخاصة بك أو كيفية استخدامها أو تصميم.التي قد تغير توصيتي.

نصائح أخرى

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

لا يمكنك تصميم أنحاء سيئة/للمستخدمين عديمي الخبرة.

إذا كنت تعطي زبائنك من الوصول إلى weak_ptrs يمكن فقط قفل لهم لخلق shared_ptrs وفي نهاية المطاف تأخير تدمير الكائنات.قد يسبب مشاكل مع المكتبة الخاصة بك.

أقترح لف weak_ptr في بعض فئة أخرى وإعطاء المتصل shared_ptr إلى هذا.تلك الطريقة التي لا يمكن أن مجرد دعوة weak_ptr<T>::lock().يبدو أن لديك الأداء المعوقات التي قد تؤثر على كيفية تنفيذ ذلك ، ولكن shared_ptr<InterfaceClass> قد يكون وسيلة جيدة للذهاب ، والحفاظ على الطبقة مع weak_ptr الداخلية إلى المكتبة الخاصة بك.

بهذه الطريقة يمكنك أيضا الحفاظ على هذه تفاصيل التنفيذ من المكتبة الخاصة بك واجهة يمكنك تغيير طريقة تنفيذ ذلك دون تغيير واجهة الخاص بك.

أنا لا أرى أي مشكلة مع تعريض weak_ptrs ، خاصة وأن TR1 مماثلة المؤشرات الذكية (PDF).

TR1 إلى حد كبير تنفيذها من قبل Visual Studio و دول مجلس التعاون الخليجي ، ولكن ليس بعض المجمعين هناك.ولكن عندما تنفذ في جميع المجمعين يهمك, قد تحتاج إلى إعادة صياغة API لفضح تلك المؤشرات الذكية بدلا من ذلك.

إذا كنت تريد أن كلا من فخ صالح استخدام المكتبة (يحاول الوصول إلى الأشياء عندما تم حذفها) وكذلك لديها عالية الأداء API (لا weak_ptr و shared_ptr في API) ، ثم يمكن النظر في مختلف API من أجل التصحيح و nondebug يبني.

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

#ifdef DEBUG
typedef ObjectPtrFacade ObjectPtr 
#else
typedef Object * ObjectPtr;
#endif

هنا الواجهة الدرجة التي تكتب.يعمل تقريبا مثل هذا:

class ObjectPtrFacade {
public:
    ObjectPtrFacade(Object *o) : wptr(o) { }
    // copy constructor and assignment here etc. (not written)
    Object * operator -> () const { return access(); }
    Object & operator * () const { return *access(); }
private:
    Object * access() { 
      assert(wptr.use_count() > 0);
      return (Object *)(wptr.lock());
    }
    weak_ptr<Object> wptr; 
}

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

في العام بالطبع فمن ذلك أن استخدام weak_ptr هذا لا يساعد إذا كان لديك "غبي" المستخدمين من API, لأنها يمكن أن نسميه قفل() ومن ثم لا تزال تجعل فارغة-المؤشر المرجعي بعد weak_ptr ترجع shared_ptr فارغة...

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