ホームページ > バックエンド開発 > C++ > C で「this」の `std::shared_ptr` を親オブジェクトからその子オブジェクトに安全に渡すにはどうすればよいですか?

C で「this」の `std::shared_ptr` を親オブジェクトからその子オブジェクトに安全に渡すにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-29 13:12:29
オリジナル
952 人が閲覧しました

How can I safely pass a `std::shared_ptr` of

std::shared_ptr を使用して "this" の参照を渡す方法

オブジェクト指向プログラミングでは、オブジェクトお互いの関係を維持するため。これには、多くの場合、相互の参照を保持するオブジェクトが含まれ、通信とデータ共有が可能になります。 C でオブジェクト参照を管理する 1 つの方法は、スマート ポインター、特に std::shared_ptr を使用することです。

クラス A がクラス B のオブジェクトへの std::shared_ptr 参照のリストを保持するという仮想シナリオを考えてみましょう。ここで、各 B オブジェクトは、その親である A オブジェクトへの参照も保持する必要があります。これは課題を引き起こします: クラス A は、それ自体 (this) の std::shared_ptr をその子 B に安全に渡すにはどうすればよいでしょうか?

簡単なアプローチは、child->setParent(this); のようなものを試すことかもしれません。ですが、これは有効な std::shared_ptr ではないため、正しくありません。解決策は、std::enable_shared_from_this の使用にあります。

std::enable_shared_from_this の紹介

std::enable_shared_from_this は、オブジェクトが std を返すことを可能にする基本クラスです。 ::shared_ptr 自身への参照。 std::enable_shared_from_this を継承することにより、クラス A は .shared_from_this() を呼び出して独自のインスタンスへの共有ポインターを取得できるようになります。

std::enable_shared_from_this を使用した解決策

以下の変更されたコードでは、クラス A が std::enable_shared_from_this から継承するようになり、child->setParent() 呼び出しで .shared_from_this():

<code class="cpp">class A : public std::enable_shared_from_this<A>
{
public:
    void addChild(std::shared_ptr<B> child)
    {
        children.push_back(child);
        child->setParent(shared_from_this());
    }

private:
    // Note the use of std::weak_ptr here
    std::list<std::weak_ptr<B>> children;
};</code>
ログイン後にコピー

が使用されるようになりました。コード:

  • クラス A は std::enable_shared_from_this を継承し、.shared_from_this() の使用を有効にします。
  • .shared_from_this() はクラス A のインスタンスへの共有ポインタを返します。これは、B オブジェクトに安全に渡されます。
  • std::weak_ptr は、循環依存関係を防ぎ、リソース リークを避けるために、クラス A の子リストに使用されます。

このアプローチは、次のことを解決します。 「this」の std::shared_ptr を親 A オブジェクトからその子 B オブジェクトに渡す問題。 std::enable_shared_from_this を使用し、std::weak_ptr で循環依存関係を管理することにより、安全で効果的な参照共有メカニズムが実現します。

以上がC で「this」の `std::shared_ptr` を親オブジェクトからその子オブジェクトに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート