2009-06-29 77 views
2

是否有一種標準的方法來維護C++中的子對象中的父指針(使用共享指針創建)的弱指針?如何在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實例化。我可以考慮使用空刪除器的解決方案。但是,這是做這種事的標準方式嗎?

回答

2

還有就是weak_ptr的隱式轉換,這樣你就可以直接使用

void SetParentPtr(boost::weak_ptr<A> a) { } 

還檢查boost :: shared_from_this,所以父母可以給自己一個指針而不顯式存儲weak_ptr。

否則,這似乎是一個正常的方式有一個反指針。只需檢查使用後向指針是否有真正的附加值。

5

你在做什麼上面明確支持weak_ptrshared_ptr,當你嘗試時會發生什麼?更精確地說,你在做什麼,沒有空刪除器,然後使用在weak_ptr標準的行爲,將其轉換爲一個shared_ptr需要:

boost::shared_ptr<X> it=myWeakPtr.lock(); 
if (it) 
{ 
    // if the conversion succeeded, then the parent instance is still alive 
} 
1

我會嘗試做這樣的事情:

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; 
}; 
+0

stefaanv恕我直言,建議enable_shared_from這個範例更適合我正在嘗試做的事情。它使得用戶可以透明地從父級的任何成員函數中獲取共享指針 - 然後可以將其分配給子級持有的弱指針。 – anbhat 2009-06-30 04:33:48