【发布时间】:2017-09-05 15:10:11
【问题描述】:
对于 C 类的私有类成员 M 的延迟初始化是否有最佳实践?例如:
class C {
public:
C();
// This works properly without m, and maybe called at any time,
// even before startWork was called.
someSimpleStuff();
// Called single time, once param is known and work can be started.
startWork(int param);
// Uses m. Called multiple times.
// Guaranteed to only be called after startWork was called
doProcessing();
private:
M m;
};
class M {
M(int param);
};
无法构造 C 类的对象,因为 M 没有默认初始化程序。
如果您可以修改M 的实现,则可以将init 方法添加到M,并使其构造函数不接受任何参数,这样就可以构造C 类的对象。
如果没有,您可以将C 的成员m 包装在std::unique_ptr 中,并在可能时构造它。
但是,这两种解决方案都容易出现错误,这些错误会在运行时被捕获。是否有一些做法可以确保在 编译时 m 仅在其初始化后使用?
限制:C 类的对象交给外部代码使用其公共接口,因此 C 的公共方法不能拆分为多个类。
【问题讨论】:
-
通过使用 uniqe_ptr 和 get() 函数的包装类,您可以确保在未初始化的情况下不使用它。但是,您无法确保您的代码不会尝试这样做,因此您仍然受限于运行时错误或默认参数。
-
为什么需要使用延迟初始化?你打算什么时候做?
m甚至需要成为会员吗?从您的示例代码看来,每次您想在C中做一些“工作”时,您都在传递param。 -
@SimonKraemer 澄清代码示例。
-
这可能(或可能不)在这里相关:stackoverflow.com/questions/35338724/…
标签: c++ constructor