c++ - std::shared_ptr 和双重回调

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

我有一些逻辑,我将 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/

相关文章:

c++ - 导入地址表为导入名称生成不正确的 RVA

c++ - Qt C++ 删除 QList<float**> 中的 float** 元素

c++ - 有没有一种直接的方法可以在不通过无关 Material 的情况下获得有关 gcc 可接受的选项值(例如 -std)的明确详细信息?

c++ - 如何使用多态参数动态调用函数

c++ - 不友好的数字c++

c++ - 初始化指向 vector 的指针 vector

python - Boost.Python boost::shared_ptr 没有通过值转换器找到 python

c++ - shared_ptr 与 QThreadPool

C++:关于访问者模式的疑惑

c++ - 双重分派(dispatch)的循环依赖