假设我们有
class Foo
{
public:
Foo(A a, B b);
//other member functions and variables
}
class Bar
{
public:
Bar();
private:
Foo foo;
//other member variables
}
理想情况下foo
,class Bar
应使用初始化列表来初始化的成员。但是,如果的初始化foo
取决于Bar
构造函数中的某些操作,则初始化列表将不是一个选项。并且由于foo
必须在输入Bar
的构造函数之前进行初始化,因此最佳的设计选择是什么?
我四处搜寻,发现了一些选项,例如使用std::unique_ptr<Foo> pfoo;
(延迟类初始化私有类成员的最佳实践),但是在某种程度上,设计对我来说似乎很草率。
我想避免使用原始指针Foo *
。
预先感谢您的输入!
您可以替换有问题的:
class Bar
{
public:
Bar()
{
const Data& data = ComplexFunction();
// How initialize foo ?
}
private:
Foo foo;
//other member variables
};
通过类似:
class Bar
{
public:
Bar() : Bar(ComplexFunction()) {} // Delegate constructor
private:
Bar(const Data& data) : foo(data.a, data.b) {}
private:
Foo foo;
//other member variables
};
如果您想真正推迟构建Foo
(通过两步初始化),我会使用optional
(boost
如果std
一个不可用,则使用一个(C ++ 17))。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句