1

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

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

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

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

4

2 回答 2

8

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

这与您现在使用weak_ptr.

于 2011-04-15T11:51:52.300 回答
1

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

于 2011-04-15T12:09:47.077 回答