【问题标题】:std::shared_ptr and double callbackstd::shared_ptr 和双重回调
【发布时间】:2011-08-06 06:44:34
【问题描述】:

我有一些逻辑,我将 std::shared_ptrs 用于继承层次结构中的对象。有一次我需要根据它们的真实类型来处理这些对象,所以我使用了双重调度(即我调用基类上的一个方法,然后它又调用另一个具有真实类型的对象上的方法,参见例如GoF 中的访问者模式)。

现在,我可以传递对具有正确类型或副本的对象的引用。出于多种原因,副本是不可能的。引用通常没问题,因为调用发生在 shared_ptr 所在的范围之下,因此在调用发生时它不会被销毁。但是对于某些子类型,我需要将对象存储在 STL 容器中,因此我需要绝对确定它不会被破坏。显然,裸指针或新的 shared_ptrs 在这里不起作用,所以我需要获取对调用 this 的 shared_ptr 的引用。

现在我正在做以下事情: 我使用命名构造函数而不是真实的构造函数来创建对象。这会在对象内部设置一个 weak_ptr 并给出一个 shared_ptr 以供对象使用。当双重回调发生时,我从 weak_ptr 获得一个新的 shared_ptr 并将其存储在 Container 中,因此对象不会被破坏。然而,这让我的构造逻辑非常难看。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c++ shared-ptr double-dispatch weak-ptr


    【解决方案1】:

    std::enable_shared_from_this 派生你的类 - 然后你可以随时从你的对象中提取一个 shared_ptr!

    这与您现在使用 weak_ptr 所做的并没有太大的不同,但它是干净且被接受的习语。

    【讨论】:

      【解决方案2】:

      您可以使用 dynamic_pointer_cast 将 shared_ptr 传递给具有正确类型的对象。

      【讨论】:

        猜你喜欢
        • 2013-06-12
        • 2013-04-16
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 2012-09-01
        相关资源
        最近更新 更多