转发没有类声明的shared_ptr

edA*_*a-y 11 c++ boost c++11

注意:我发现错误的来源实际上与shared_ptr无关,只是在错误消息中巧妙地伪装.因此,下面基本上是无稽之谈(不是答案,他们很好)

-

我在使用shared_ptr(目前的提升)时遇到了一些麻烦,我需要简单地将指针转发给另一个函数.使用本机指针,介入函数不需要访问类的定义,但是使用smart_ptr它就可以了.有什么方法可以避免这种情况吗?

例如,给定目标函数:

void func( shared_ptr<SomeClass> const & obj )
Run Code Online (Sandbox Code Playgroud)

const &负责的问题的一部分,而是说我们有一个getter类获得对象为其他类,如:

shared_ptr<SomeClass> someClassInstance();
Run Code Online (Sandbox Code Playgroud)

这里是我想简单地组装参数并转发到目标函数的地方:

func( someClassInstance() );
Run Code Online (Sandbox Code Playgroud)

使用普通指针,代码中的这一点可以简单地使用前向声明SomeClass,但是smart_ptr需要具有完整定义(可能是因为smart_ptr可能需要删除该类).

现在,如果someClassInstance要返回const &这个问题实际上会消失,因为介入的代码不会复制任何对象.但是,出于线程安全原因,getter函数必须返回副本.

无论如何我可以实现这种类型的智能指针参数转发而不需要类定义吗?也就是说,我可以像在这种情况下使用传统指针一样使用智能指针.

-

更新:写一个小测试答案是正确的,前向声明就足够了.然而海湾合作委员会仍然在一种情况下抱怨.我将不得不弄清楚导致它失败的原因(在这种特殊情况下).

我现在暂时关闭这个问题,或者什么?

Seb*_*ach 15

T每次提及时,您至少需要一份前瞻性声明shared_ptr<T>.

只有你使用一元,shared_ptr::operator*并且shared_ptr::operator->需要完整的东西.在引擎盖下,shared_ptr使用编译时和运行时多态的混合,使这成为可能.另请参阅此问题以了解"魔术".

例:

// frob.h
#ifndef FROB_H
#define FROB_H

#include <shared_ptr>

class Foo;
void grind (std::shared_ptr<Foo>);

#endif
Run Code Online (Sandbox Code Playgroud)

请注意,规范的传递方式shared_ptr是按值(即删除const&).

  • @ edA-qamort-ora-y那不是真的.赋值使用由构造函数修复的自定义删除器.前向声明足以使用`shared_ptr`; 调用它的构造函数时只需要定义. (2认同)