首頁 >後端開發 >C++ >如何在 C 中安全地將「this」的「std::shared_ptr」從父物件傳遞到其子物件?

如何在 C 中安全地將「this」的「std::shared_ptr」從父物件傳遞到其子物件?

Susan Sarandon
Susan Sarandon原創
2024-10-29 13:12:29957瀏覽

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

如何使用std::shared_ptr 傳遞「this」的引用

在物件導向程式設計中,物件很常見以維持彼此的關係。這通常涉及物件之間保存引用,從而允許通訊和資料共享。在 C 中管理物件參考的一種方法是使用智慧指針,特別是 std::shared_ptr。

考慮假設場景,其中類 A 保存對類 B 的對象的 std::shared_ptr 引用列表,其中每個 B 對象還需要保存對其父 A 對象的引用。這提出了一個挑戰:A 類別如何安全地將自身的 std::shared_ptr (this) 傳遞給其子 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,並且以下修改後的程式碼中,類別A 繼承自std::enable_shared_from_this,並且我們->setParentchild(child)呼叫現在使用.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>

在此更新中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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn