std :: shared_ptr和双回调

时间:2011-04-15 11:46:26

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

我有一些逻辑,我将std :: shared_ptrs用于继承层次结构中的对象。有一点我需要处理这些对象,具体取决于它们的实际类型,所以我使用了一个双重调度(即我在基类上调用一个方法,然后在另一个对象上调用实际类型的方法,参见eg GoF中的访客模式)。

现在,我可以使用正确的类型或副本传递对象的引用。由于几个原因,副本是不可能的。引用通常很好,因为调用发生在shared_ptr所在的范围之下,因此在调用发生时不会销毁它。但是对于某些子类型,我需要将对象存储在STL容器中,所以我需要绝对确定它不会被销毁。显然,裸指针或新的shared_ptrs在这里不起作用,所以我需要获取对其进行调用的shared_ptr的引用。

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

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:8)

std::enable_shared_from_this派生您的课程 - 然后您可以随时从您的对象中提取shared_ptr!

与你现在使用weak_ptr所做的事情并没有太大的不同,但这是干净利落的习惯。

答案 1 :(得分:1)

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

相关问题