唯一指针初始化

问题描述 投票:0回答:1

我对C ++还是陌生的,如果这很明显,我深表歉意,但是经过大量的谷歌搜索后,我找不到很好的答案。我希望我可以编写以下代码。

class Test {
public:
    Test();

private:
    std::unique_ptr<Dummy> m_Dummy;
};
Test::Test() {
    auto data = // generate some data here
    m_Dummy = std::make_unique<Dummy>(data);
}

会发生什么:m_Dummy上的赋值运算符调用unique_ptr::reset,该调用指针上的删除,调用m_Dummy析构函数,运行析构函数会创建一个段错误,因为它从未被初始化过。

正确的方法是将其初始化为构造函数初始化列表。但是那样我将无法传递我想要的数据。

Test::Test() : m_Dummy{std::make_unique<Dummy>(data)} { // Don't have time to generate data
}

我不确定如何使这种清洁剂。我当前的想法是将Dummy更改为具有默认构造函数,然后更改一个initialize函数以获取数据。不过感觉很不对。

是否有更清洁的方法来处理此问题?通常,需要参数并且还必须是类成员的智能指针会做什么?

谢谢,内森

c++ smart-pointers
1个回答
0
投票

创建一个静态方法来生成数据?

class Test {
public:
    Test();

private:
    static Dummy makeConstructionData()
    {
      return Dummy();
    }
    std::unique_ptr<Dummy> m_Dummy;
};

然后您可以:

Test::Test() : m_Dummy{std::make_unique<Dummy>(makeConstructionData())} { 
}
© www.soinside.com 2019 - 2024. All rights reserved.