0

2番目のオブジェクトのクラスに最初のオブジェクトを明示的に認識させずに、別のオブジェクトがまだ存在している間に特定のオブジェクトが破壊されるのを防ぐ方法はありますか?

次に例を示します。

class A { /* A creates B*/ };
class B {};

int main() {
    auto spA = std::make_shared<A>();
    auto spB = spA->getB();

    spA.reset();
    spB->DoSomething(); 
}

の後spA.reset()、 が指すオブジェクトへの参照が少なくとも 1 つ必要spAです。spAまたは、言い換えると、 を呼び出した後でのみ、 が指すオブジェクトを破棄したいと考えていますspB->DoSomething()

ただし、重要な前提条件として、B「知る」Aことが許可されていません (たとえば、ポインター/参照を保持することは許可されていません)。

私が理解しているように、共有ポインターはこの問題の処理に役立ついくつかの機能を提供しますが、どれがどれかはわかりません。

編集:

との簡単な構造は次のようにAなりBます。

class A 
{
public:
    A() 
    { 
        m_B = B::FactoryB(); 
    }
    std::shared_ptr<B> getB()
    {
        return m_B;
    }
private:
    std::shared_ptr<B> m_B; 
};

class B 
{
public:
    static std::shared_ptr FactoryB()
    {
        return std::make_shared<B>();
    }
};

EDIT2(私の解決策):

そのため、@MSalters から提供された提案を使用して、自分に合った解決策を見つけることができました。この場合、調整するだけでよいように、予想よりもはるかに単純でしたA::getB()

    std::shared_ptr<B> getB()
    {
        std::shared<B> spBAlias(this->shared_from_this(), m_B.get());
        return spBAlias;
    }

ここでは、単に を返す代わりに、 (エイリアス コンストラクターを使用して)型の共有ポインターを作成して返しますm_B。これは、オブジェクト ( によって提供される)の参照カウントに影響を与えます。そのため、呼び出しが2 つから 1 つに減り、呼び出しが可能になります。を使用するには、から継承する必要があります:A::getB()spBAliasBAthis->shared_from_this()spA.reset()mainspAspB->DoSomething()shared_from_this()Astd::enable_shared_from_this<A>

class A : public std::enable_shared_from_this<A> { /* ... */ }
4

2 に答える 2