كيفية الحفاظ على مؤشر ضعيف لأحد الوالدين في C ++؟

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

سؤال

هل هناك وسيلة معيارية للحفاظ على مؤشر ضعيف لأحد الوالدين (والذي يتم إنشاؤه باستخدام مؤشر المشتركة) في كائن تابع في 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;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top