延迟复杂类的初始化是糟糕的类设计吗?

Is it bad class design to have deferred initialization of complex class?

提问人:YoonSeok OH 提问时间:6/7/2023 更新时间:6/7/2023 访问量:53

问:

我知道 RAII,并试图坚持单步实例化。只要给定了成员的所有参数,instance 就是有效的,它会在析构函数处进行销毁。

但是,如果类足够大,可以存储多个结构,则构造函数很快就会有太多的参数。此外,如果一个类具有依赖实例化,例如 LoadFromXXX 或 InitializeFromXXX 类型的函数,那么 2 步实例化对我来说似乎是最佳选择。特别是,如果类实例是其他类的成员(不是指针),则构造函数链开始,并且必须获取所有构造函数参数。换句话说,很难插入这样的操作

Instance.LoadConfig(FilePath);
Instance.Create();

对我来说,通过应用与构建器有些相似的应用来应对过多的参数情况和延迟的实例化,同时丢失单步 RAII,这似乎是很好的解决方法。可以使用 if 在析构函数中管理发布问题。

if (pAllocated)
    delete pAllocated;

Or pAllocated->Release();

我能想到的这种方法的唯一问题是这会打开部分有效的实例或空实例。

这是不可接受的坏事吗?

C++ 初始化 RAII

评论

0赞 Thomas Matthews 6/7/2023
我从未听说过 RAII 坚持单步实例化。我昨天对一些代码进行了更改,现在在首次使用时已初始化。初始化不小,但也不大。有时,没有方法可以避免大量的初始化代码。
0赞 YoonSeok OH 6/7/2023
真的?我在某处看到类似“init 或 2 步初始化不好吗?有点问题说有两步初始化会破坏 RAII。
1赞 Fantastic Mr Fox 6/7/2023
因此,cpp 核心指南建议:构造函数应该创建一个完全初始化的对象
1赞 Chris Dodd 6/7/2023
“多步骤初始化”或类似操作的问题在于,所有复制/移动函数、赋值运算符和析构函数都需要了解所有步骤,并准备好在任何中间步骤中正确处理对象。
1赞 dmedine 6/7/2023
有时,您别无选择,只能在初始化对象所需的所有数据可用之前实例化该对象。你只需要内置一些保险杠导轨,这样在初始化完成之前它不会做未初始化的事情。

答: 暂无答案