boost shared_ptr 初始化为类成员

Posted

技术标签:

【中文标题】boost shared_ptr 初始化为类成员【英文标题】:boost shared_ptr initialize as class member 【发布时间】:2015-04-10 20:34:55 【问题描述】:

boost::shared_ptr 是类的成员变量时,我在初始化它时遇到问题。我看到了这个以前的问题:

How to initialize a shared_ptr that is a member of a class?

但是我仍然遇到编译器错误。快速示例代码:

class A

    public:
      A();
;

class B

    public:
       B();
    private:
        boost::shared_ptr<A> mA;

        foo() 

           // the line below generates a compiler error
           mA(new A());       // ERROR

           // below will work....
           boost::shared_ptr<A> tmp(new A());    //OK
           mA = tmp;

        
 ;

编译器抱怨: error: no match for call to "(boost::shared_ptr&lt;A&gt;) (A*)"

但是,创建一个 tmp shared_ptr 然后将其分配给 mA 可以正常编译。我正在为 Intel Edison 的 Ubuntu 14.04 机器上进行交叉编译。

我错过了什么?

【问题讨论】:

使用构造函数初始化列表 - foo() : mA(new A()) ...foo() : mA(boost::make_shared&lt;A&gt;()) ... 这与shared_ptr没有任何关系,如果mAint,那么在构造函数中尝试执行mA(0) 也会遇到同样的问题身体。成员在构造函数主体开始时已经初始化,因此您需要更早地初始化它们(在 mem-initializer 列表中)或在主体中分配给它们。获得一本关于 C++ 的好书。 我不同意。如果 mA 是一个 int 我会使用 mem-initializer 列表,或者在构造函数主体中设置它,ma = 2 或其他。这是我初始化shared_ptr的无知,我发布了这个问题。 【参考方案1】:

您正在寻找mA.reset(new A());

现在共享指针也是标准的一部分,所以你应该使用std::shared_ptr

【讨论】:

这就解决了。谢谢。也切换到 std::shared_ptr

以上是关于boost shared_ptr 初始化为类成员的主要内容,如果未能解决你的问题,请参考以下文章

提升 shared_ptr 和派生类

boost::shared_ptr - 两个类之间的组合关系

类的 boost::shared_ptr 作为结构成员

使用 boost::shared_ptr 访问静态成员变量

类树的一个分支如何使其所有零初始化成员都是垃圾?

使用 boost::asio::ip::tcp::socket 作为 shared_ptr