gpt4 book ai didi

c++ - 针对 "initialize()"方法而不是构造函数的参数

转载 作者:可可西里 更新时间:2023-11-01 18:20:57 30 4
gpt4 key购买 nike

我目前负责查找我们代码库中的所有不良做法,并说服我的同事修复有问题的代码。在我的探索过程中,我注意到这里的很多人都使用以下模式:

class Foo
{
public:
Foo() { /* Do nothing here */ }
bool initialize() { /* Do all the initialization stuff and return true on success. */ }
~Foo() { /* Do all the cleanup */ }
};

现在我可能是错的,但对我来说这个 initialize() 方法很糟糕。我相信它取消了拥有构造函数的全部目的。

当我问我的同事为什么做出这个设计决定时,他们总是回答说他们别无选择,因为你不能在不抛出的情况下退出构造函数(我猜他们认为抛出总是不好) .

到目前为止,我没能说服他们,我承认我可能缺乏有值(value)的论据……所以这是我的问题:我说的对吗,这种构造很痛苦,如果是这样,您在它?

谢谢。

最佳答案

单步(构造函数)初始化和两步(使用 init 方法)初始化都是有用的模式。我个人认为排除其中任何一个都是错误的,尽管如果您的约定完全禁止使用异常,那么您将禁止对可能失败的构造函数进行单步初始化。

一般来说,我更喜欢单步初始化,因为这意味着你的对象可以有更强的不变量。当我认为对象能够以“未初始化”状态存在有意义或有用时,我只使用两步初始化。

通过两步初始化,您的对象处于未初始化状态是有效的 - 因此与该对象一起使用的每个方法都需要了解并正确处理事实上,它可能处于未初始化状态。这类似于使用指针,假设指针不为 NULL 是一种糟糕的形式。相反,如果您在构造函数中完成所有初始化并因异常而失败,那么您可以将“对象始终初始化”添加到不变量列表中,因此它变得更容易和更安全对对象的状态做出假设。

关于c++ - 针对 "initialize()"方法而不是构造函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767767/

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