gpt4 book ai didi

c++ - 避免两阶段初始化

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:19 26 4
gpt4 key购买 nike

我一直在做一些阅读,一般的意见似乎是尽可能避免两阶段初始化。我同意它所说的大部分内容。但我发现消除它并不容易。

这是一个完全虚构的例子,尽管它强烈地基于一些真实的代码——

假设我正在开发一款游戏。主游戏类需要构造一个进行 3d 渲染的“RenderDevice”对象。但是为了构建它,它需要从配置文件中加载一些设置。和一个要绘制到其中的 Window 对象。还有一个记录器对象和一个内存池。我的代码现在将所有这些东西作为类成员放置在构造函数几乎不做的地方,然后使用相关参数在每个对象上调用一个 init 函数,比如:-

// Much simplified code to make a point
Game::Game()
{
memoryPool_.init(10000000); // Amount of memory to allocate
logger_.init("logfile.txt", memoryPool_);
window_.init(2000, 1000); // Make a nice big window
renderDevice_.init(window_, logger_, memoryPool_);
}

在我看来,这似乎工作得相当好。但这是两个阶段。每个对象仅由其构造函数部分构造。所以我必须做一些类似这样的事情,而不是让代码“干净”。

Game::Game() :
memoryPool_(1000000),
logger_("logfile.txt", memoryPool_),
window_(2000, 1000),
renderDevice_(window_, logger_, memoryPool)
{
}

现在这段代码在我看来相当丑陋,但也相当脆弱,因为初始化顺序取决于它们在类中声明的顺序,而不是此处列出的顺序。随着越来越多的数据被添加到类中,情况变得更糟。这里的对象只需要几个参数,但如果它们需要更多数据,这将很快失控。

它的优点是每个对象都已准备就绪,可以完成它的工作,但对我来说它看起来很丑,而且看起来相当脆弱且容易出错......

所以我的问题是我错过了重点吗?有一个更好的方法吗?我应该停止担心并只做这个,还是应该使用我的原始代码?或者我的整个设计在某种程度上在更高层次上是错误的,所以这个问题没有用?

基本上什么是最佳实践?

最佳答案

Now that code seems rather ugly to me

我不这么认为。也许你只是不习惯?

rather fragile as the order of initialization depends on the order they are declared in the class, NOT the order listed here

打开编译器的警告,它应该会告诉您这两个命令之间的不匹配。 (我知道 Clang 有这个警告,我很确定 GCC 也有。不太确定 MSVC。)

The objects here only require a few parameters but if they need more data this will rapidly get out of hand.

当您使用 init() 时,我看不出有什么不同。

关于c++ - 避免两阶段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475833/

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