gpt4 book ai didi

c++ - 私有(private)类成员延迟初始化的最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:12 24 4
gpt4 key购买 nike

对于 C 类的私有(private)类成员 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 的实现,则可以向M 添加一个init 方法,并使其构造函数不接受任何参数, 这将允许构造 C 类的对象。

如果没有,您可以将C 的成员m 包装在std::unique_ptr 中,并在可能时构造它。

但是,这两种解决方案都容易出错,这些错误会在运行时被捕获。是否有一些实践可以确保在编译时 m 仅在其初始化后使用?

限制:类C的对象被交给使用其公共(public)接口(interface)的外部代码,因此C的公共(public)方法不能拆分为多个类。

最佳答案

最佳实践是永远不要使用延迟初始化。

在您的情况下,放弃 C 的默认构造函数并将其替换为 C(int param) : m(param){}。也就是说,类成员在构造时使用基本成员初始化进行初始化。

使用延迟初始化意味着您的对象可能处于未定义状态,并且更难实现诸如并发之类的事情。

关于c++ - 私有(private)类成员延迟初始化的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com