2009-06-29 7 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を使用してインスタンス化されます。私はnull deleterを使用するソリューションを考えることができます。しかし、それはこのようなことをする標準的な方法ですか?

答えて

2

ありweak_ptrをへの暗黙的な変換があるので、あなたは直接

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

を使用することができます。

また、boost :: shared_from_thisをチェックすると、親はweak_ptrを明示的に格納せずに自分自身へのポインタを与えることができます。

これ以外の場合、これはバックポインタを持つ通常の方法のようです。バックポインタを使用する際に実際に付加価値があるかどうかをチェックするだけです。

5

上記の作業は、明示的にweak_ptrshared_ptrでサポートされていますが、試してみるとどうなりますか?ヌル削除手段なしに、あなたは何をしているかを行い、より正確に、そして必要に応じて、あなたはshared_ptrに変換するweak_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 IMHOが提案したenable_shared_fromというこのパラダイムは、私がやろうとしていたことに適しています。これは、親のメンバー関数内で共有ポインターを取得するためにユーザーに透過的になります。子ポインターは、子が保持する弱ポインタ​​に割り当てることができます。 – anbhat

関連する問題