【问题标题】:Shared argument in constructor initializer list构造函数初始值设定项列表中的共享参数
【发布时间】:2015-12-11 01:03:38
【问题描述】:

我有这些课程:

class A
{
public:
    A(std::shared_ptr<SomeClass> p);
private:
    std::shared_ptr<SomeClass> _p;
};

class B
{
public:
    B(std::shared_ptr<SomeClass> p);
private:
    std::shared_ptr<SomeClass> _p;
};

class Foo
{
public:
    Foo();
private:
    A _a;
    B _b;
};

来自AB 的两个构造函数参数共享相同的指针引用shared_ptr。在这种情况下:

  • 初始化Foo 的最佳方式是什么?

  • 是否还可以在Foos 构造函数中使用初始化列表?

我很困惑,因为两个类都需要相同的shared_ptrinstance,所以我必须将该指针存储在某个地方,而且我认为初始化列表不可能做到这一点。

另外,如果初始化发生在构造函数的主体中,这意味着AB 都应该有一个move 构造函数,对吗?因为我必须这样做:

Foo::Foo() //: Cannot use initializer list
{
    auto ptr = std::make_shared<SomeClass>(SomeClass());
    _a = A(ptr);
    _b = B(ptr);
}

【问题讨论】:

    标签: c++ constructor shared-ptr initializer-list


    【解决方案1】:

    其实,我想到了一个更好的解决方案。创建shared_ptr,然后委托给私有构造函数,该构造函数将使用它来构造_a_b。 (感谢 Zan Lynx 建议使用函数参数作为临时存储。)

    class Foo {
    public:
        Foo(): Foo(std::make_shared<SomeClass>()) {}
    private:
        Foo(std::shared_ptr<SomeClass> ptr): _a(ptr), _b(ptr) {}
        A _a;
        B _b;
    };
    

    【讨论】:

      【解决方案2】:

      您不能在构造函数的主体中初始化成员。当主体开始执行时,成员必须已经初始化。因此,如果您尝试这样做,成员将是默认构造的,然后您将只是分配给他们。 AB 没有默认构造函数,因此无法编译。

      如果您负担得起增加的大小,请将shared_ptr 也设为Foo 的成员并使用它。

      class Foo {
      public:
          Foo(): _ptr(std::make_shared<SomeClass>()), _a(_ptr), _b(_ptr) {}
      private:
          std::shared_ptr<SomeClass> _ptr;
          A _a;
          B _b;
      };
      

      【讨论】:

      • 我相信你也可以给 Foo() 构造函数一个默认参数,并将其用作指针的临时存储。
      • @ZanLynx 聪明!虽然,你只是激励我想出一个更好的解决方案......
      【解决方案3】:

      鉴于您定义类的方式(即无法访问内部shared_ptr),我认为您的解决方案很好。但请注意,AB 将需要默认构造函数。这就是在你进入构造函数体之前初始化它们的方式。

      此外,一旦您进入构造函数主体,您将执行assignment。所以AB 都需要赋值运算符。

      另外,我觉得将std::shared_ptr 作为引用传递给函数(包括构造函数)是一种很好的做法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多