0

Aclassへのメンバーポインタを持つクラスがありますB:

class A 
{
public: 
    A() 
    {
        m_b = createB();
    }
    std::shared<B> getSpB()
    {
        return m_b;
    }
private:
    std::shared<B> m_b;
};

class B 
{
public: 
    B() {}

    static std::shared_ptr<B> createB()
    {
        return std::make_shared<B>();
    }
    void func1() {/* ... */ }

private:
};

私のmain関数では、shared_ptrof クラスを作成し、A両方のクラスのいくつかのメソッドを使用します。

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

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

ただし、 のメソッドを使用する前にB、ポインターfunc1()をリセットしたいと思います。spAしかし、オブジェクトspAが指しているが、まだ破棄することは許可されていません ( が指すオブジェクトはのメンバーのspB一部に対する参照を保持できるため、設計要件)。A

それができるようにするために、Bへのポインターも保持できると思いました。しかし、はのコンストラクターから作成されるため、まだ初期化するオブジェクトはありません。AA* m_ABAAm_A

のコンストラクターを に渡しthisても問題は解決しません。これは、 の最初の行で作成された と所有権を共有しないためです。AcreateB(this)spAmain()spAspA.reset()

私が持っていた別の選択肢は、を作成することでしm_Aたが、オブジェクトがまだ作成されていないため、のコンストラクターをに渡すshared_ptrことは不可能です。shared_from_this()AcreateB(this->shared_from_this())A

この問題を解決する方法について何か提案はありますか?

4

0 に答える 0