2

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 デリーターを使用するソリューションを考えることができます。しかし、それはこのようなことを行う標準的な方法ですか?

4

3 に答える 3

5

weak_ptr上記で行っていることは、とによって明示的にサポートされてshared_ptrいます。試してみるとどうなりますか? より正確に言うと、null 削除機能を使用せずに、現在行っていることを行い、必要に応じて の標準動作を使用してweak_ptrに変換しshared_ptrます。

boost::shared_ptr<X> it=myWeakPtr.lock();
if (it)
{
  // if the conversion succeeded, then the parent instance is still alive
}
于 2009-06-29T01:52:14.073 に答える
2

weak_ptr への暗黙的な変換があるため、使用できます

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

直接。

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

それ以外の場合、これはバックポインターを持つ通常の方法のようです。バックポインターを使用することに真の付加価値があるかどうかを確認してください。

于 2009-06-29T11:01:03.237 に答える
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;
};
于 2009-06-29T04:11:11.457 に答える