我有一些逻辑,我将 std::shared_ptrs 用于继承层次结构中的对象。有一次我需要根据它们的真实类型来处理这些对象,所以我使用了双重调度(即我调用基类上的一个方法,然后它又调用另一个具有真实类型的对象上的方法,参见例如GoF 中的访问者模式)。
现在,我可以传递对具有正确类型或副本的对象的引用。出于多种原因,副本是不可能的。引用通常没问题,因为调用发生在 shared_ptr 所在的范围之下,因此在调用发生时它不会被破坏。但是对于某些子类型,我需要将对象存储在 STL 容器中,因此我需要绝对确定它不会被破坏。显然,裸指针或新的 shared_ptrs 在这里不起作用,所以我需要获取对调用 this 的 shared_ptr 的引用。
现在我正在做以下事情:我使用命名构造函数而不是真实的构造函数来创建对象。这会在对象内部设置一个 weak_ptr 并给出一个 shared_ptr 以供对象使用。当双重回调发生时,我从 weak_ptr 获得一个新的 shared_ptr 并将其存储在 Container 中,因此对象不会被破坏。然而,这使我的构造逻辑非常难看。
有没有更好的方法来做到这一点?