كيفية الحفاظ على مؤشر ضعيف لأحد الوالدين في C ++؟
-
20-08-2019 - |
سؤال
هل هناك وسيلة معيارية للحفاظ على مؤشر ضعيف لأحد الوالدين (والذي يتم إنشاؤه باستخدام مؤشر المشتركة) في كائن تابع في C ++؟
والأساس، ولست بحاجة لتنفيذ شيء على غرار ما يلي:
Class B;
Class A
{
...
private:
B m_b;
};
Class B
{
....
public:
void SetParentPtr(const boost::shared_ptr<A>& a)
{
m_parentPtr = a;
}
private:
boost::weak_ptr<A> m_parentPtr;
};
في ما سبق كافة مثيلات الفئة B بحاجة الى عقد مؤشر ضعف لآبائهم (أي كائن من الفئة A). يتم إنشاء مثيل كائنات فئة A باستخدام shared_ptr. أستطيع أن أفكر في الحل الذي يستخدم deleter فارغة. ولكن هل هذا وسيلة معيارية للقيام بشيء من هذا القبيل؟
المحلول
وهناك التحويل الضمني لweak_ptr، بحيث يمكنك استخدام
void SetParentPtr(boost::weak_ptr<A> a) { }
ومباشرة.
والاختيار يعزز أيضا :: shared_from_this ذلك الوالد يمكن أن تعطي مؤشر لنفسه دون تخزين weak_ptr صراحة.
وعلى خلاف ذلك، وهذا يبدو وكأنه وسيلة طبيعية لديهم الخلفية المؤشر. فقط تأكد ما إذا كان هناك قيمة مضافة حقيقية في استخدام العودة المؤشرات.
نصائح أخرى
ما تقومون به فوق ويدعم صراحة weak_ptr
وshared_ptr
، ماذا يحدث عندما تحاول ذلك؟ لنكون أكثر دقة، وتفعل ما تقومون به، دون deleter لاغية، ومن ثم استخدام السلوك القياسي على weak_ptr
لتحويله إلى shared_ptr
حسب الحاجة:
boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
// if the conversion succeeded, then the parent instance is still alive
}
وأود أن تحاول أن تفعل شيئا من هذا القبيل:
class A
{
A(){};
public:
static boost::shared_ptr<A> Create()
{
boost::shared_ptr<A> newPtr(new A());
newPtr->m_self = newPtr;
return newPtr;
}
// ...
void CreateChild()
{
m_childPtr = B::Create(m_self);
}
private:
boost::shared_ptr<B> m_childPtr;
boost::weak_ptr<A> m_self;
};
class B
{
B(){};
public:
static boost::shared_ptr<B> Create(boost::shared_ptr<A> ptrA)
{
boost::shared_ptr<B> newPtr(new B());
newPtr->m_parentPtr = ptrA;
return newPtr;
}
boost::weak_ptr<A> m_parentPtr;
};