注意:我发现错误的来源实际上与shared_ptr无关,只是在错误消息中巧妙地伪装。因此,下面基本上是无稽之谈(不是答案,它们很好)
-
我在使用shared_ptr
(目前的提升)时遇到了一些麻烦,我需要简单地将指针转发给另一个函数。使用本机指针,介入函数不需要访问类的定义,但是使用smart_ptr它就可以了。有什么方法可以避免这种情况吗?
例如,给定目标函数:
void func( shared_ptr<SomeClass> const & obj )
const &
处理问题的一部分,但是说我们有一个getter类来获取其他类的对象,例如:
shared_ptr<SomeClass> someClassInstance();
这里是我想简单地组装参数并转发到目标函数的地方:
func( someClassInstance() );
使用普通指针,代码中的这一点可以简单地使用SomeClass
的前向声明,但是使用smart_ptr
它需要具有完整定义(可能是因为smart_ptr可能需要删除类)。
现在,如果someClassInstance
要返回const &
,这个问题实际上就会消失,因为插入的代码不会复制任何对象。但是,出于线程安全原因,getter函数必须返回副本。
无论如何我可以在不需要类定义的情况下实现这种类型的智能指针参数转发吗?也就是说,我可以像在传统指针中那样使用智能指针。
-
更新:写一个小测试答案是正确的,前向声明就足够了。然而海湾合作委员会仍然在一种情况下抱怨。我将不得不弄清楚导致它失败的原因(在这种特殊情况下)。
我现在暂时关闭这个问题,或者是什么?
答案 0 :(得分:14)
每次提及T
时,您至少需要shared_ptr<T>
的前瞻性声明。
仅当您使用一元shared_ptr::operator*
和shared_ptr::operator->
时,才需要完整的内容。在引擎盖下,shared_ptr
使用了编译时和运行时多态的混合,使这成为可能。另请参阅this question以了解“神奇”。
示例:
// frob.h
#ifndef FROB_H
#define FROB_H
#include <shared_ptr>
class Foo;
void grind (std::shared_ptr<Foo>);
#endif
请注意,传递shared_ptr
的规范方法是按值(即删除const&
)。
答案 1 :(得分:3)
是的,共享指针专门用于处理不完整类型(一个杀手级功能IMO)。它们只需要类的前向声明,而不是类定义。来自Boost documentation:
请注意,scoped_ptr要求T在销毁时是完整类型,但shared_ptr不需要。
您可以找到有关其工作原理的讨论here。
由于共享指针应该与不完整的类型一起使用,您能否给我们一个特定的(最小)示例,其中这对您不起作用?
答案 2 :(得分:0)
似乎并非总是需要明确前向声明:
using PtrX = std::shared_ptr<class X>;
using PtrW = std::weak_ptr<X>;
模板参数内的class X
发挥了魔力。