2011-04-15 68 views
1

我有我在哪里使用std :: shared_ptrs对象继承层次中的一些逻辑。有一次,我需要根据自己的实际类型来处理这些对象,所以我使用的是双调度(即我呼吁基类,然后依次调用与真实类型另一个对象的方法的方法,例如见GoF的访客模式)。的std :: shared_ptr的双回调

现在,在这一点上,我既可以传递给对象的引用正确类型或复印件。由于几个原因,副本是没有问题的。引用通常会很好,因为调用发生在shared_ptr所在的范围之下的一个范围内,所以在这个调用发生时它不会被销毁。但是,对于某些子类型,我需要将对象存储在STL容器中,所以我需要绝对确保它不会被销毁。显然,裸指针或新的shared_ptrs不会在这里工作,所以我需要获得对这个被调用的shared_ptr的引用。

现在我做了以下内容: 我使用了一个名为构造函数,而不是一个真实的创建对象。这将在对象内部设置一个weak_ptr,并为该对象的使用提供shared_ptr。当发生双重回调时,我从weak_ptr中获得一个新的shared_ptr并将其存储在Container中,以便该对象不会被破坏。然而,这使得我的施工逻辑真的很难看。

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

回答

8

派生类从std::enable_shared_from_this - 那么你可以在任何时候从对象中提取一个shared_ptr!

这与现在使用weak_ptr所做的事情并没有太大的不同,但它是一种干净而广为接受的习惯用法。

相关问题