std :: shared_ptr和双回调

LiK*_*Kao 1 c++ double-dispatch shared-ptr weak-ptr

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

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

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

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

ltj*_*jax 8

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

它与你现在正在做的事情并没有很大的不同weak_ptr,但它是干净利落的成语.