我有一些逻辑,我将 std::shared_ptr 用于继承层次结构中的对象。有一次我需要根据它们的真实类型来处理这些对象,所以我使用了双重分派(dispatch)(即我在基类上调用一个方法,然后基类又调用另一个具有真实类型的对象的方法,参见例如GoF 中的访问者模式)。
现在,我可以传递对具有正确类型或拷贝的对象的引用。由于多种原因,拷贝是不可能的。引用通常会很好,因为调用发生在 shared_ptr 所在的范围以下的范围内,因此在调用发生时它不会被销毁。但是对于某些子类型,我需要将对象存储在 STL 容器中,因此我需要绝对确保它不会被破坏。显然,裸指针或新的 shared_ptr 在这里不起作用,所以我需要获取对调用它的 shared_ptr 的引用。
现在我正在做以下事情: 我使用命名构造函数而不是真正的构造函数来创建对象。这会在对象内部设置一个 weak_ptr 并给出一个 shared_ptr 以供使用该对象。当双重回调发生时,我从 weak_ptr 得到一个新的 shared_ptr 并将其存储在 Container 中,因此该对象不会被销毁。然而,这让我的构造逻辑变得非常丑陋。
有什么更好的方法吗?
最佳答案
从 std::enable_shared_from_this
派生您的类 - 然后您可以随时从您的对象中提取 shared_ptr!
这与您现在使用 weak_ptr
所做的并没有太大的不同,但这是一种干净且被接受的习惯用法。
关于c++ - std::shared_ptr 和双重回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676209/