c++ - 两步到一步初始化和错误处理

标签 c++ exception constructor initialization

这似乎是一个奇怪的问题。我目前正在将某些对象从两步初始化方案移动到一步初始化方案。基本上将 .initialize() .terminate() 成员函数中完成的操作移动到构造函数和析构函数中。

我的问题是,重要的是要知道这些类是否根据外部因素正确初始化了某些属性。

一个示例是我的 Window 类,它创建一个 WinAPI 窗口。以前使用两步法时,我会让 initialize() 返回一个 bool 值,表示窗口是否已正确创建。

if(myWindow.initialize())
{
    // proceed with application
}
else
{
    // exit
}    

是否可以在不创建和调用第二个方法(例如 didMyWindowInitializeCorrectly())的情况下从构造函数中继此信息?

一开始我希望的是

if(Window *myWindow = new Window)
{
    // proceed with application
}
else
{
    // exit
}

但这行不通,因为即使窗口创建失败,Window 对象仍将实例化。

是让构造函数抛出异常然后捕获它并继续处理的唯一解决方案吗?我看过很多话题,人们对 C++ 异常的看法似乎很 split ,所以我不确定什么是最好的方法。

有没有办法用 if 语句来处理这种情况?

最佳答案

这归结为基于异常或错误代码的初始化的大参数。我通常更喜欢 Exceptions 来指示构造函数失败,因为当问题没有通过 is_valid 检查稍后在代码中处理或忽略两步返回值时,问题在堆栈跟踪中变得更加明显。它也更清楚为什么初始化失败而不需要错误代码查找。喜欢传统 C 风格而不是异常风格故障消息的人可能会不同意我最后一点。

然而,匹配代码库其余部分的风格通常是个好主意。因此,如果代码中的其他任何地方都没有使用异常,则最好进行 is_valid 检查(或最初的两阶段初始化),而不是引入对象验证机制。我更喜欢 is_valid 而不是两个阶段,就像 Riateche 发布的那样,因为它让用户能够选择是否/何时他们想要检查它是否有效,而不需要他们去查找在他们应该合法使用该对象之前必须调用哪些函数。

关于c++ - 两步到一步初始化和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11588050/

相关文章:

java - java OOP 中没有构造函数的后果

C++,某些组合永远不会出现使用 rand()

c++ - 在接口(interface)不是时标记派生实现 noexcept 的副作用是什么

java - 是否有必要为每个错误创建用户定义的异常

java - 我应该使用 Exception 来模拟 java 中的 goto 语句吗?

c++ - 将类指针传递给类的构造函数

c++ - 如何在 Internet Explorer 中显示我自己的上下文菜单

c++ - 为什么这个 Ruby 代码比等效的 C++ 代码快得多?

Ice Cream Sandwich 上的 Android Visualizer(音频效果)运行时异常

c++ - move 构造函数与复制省略