我对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
函数以获取数据。不过感觉很不对。
是否有更清洁的方法来处理此问题?通常,需要参数并且还必须是类成员的智能指针会做什么?
谢谢,内森
创建一个静态方法来生成数据?
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())} {
}