终止构造函数中的对象创建

Terminate object creation in constructor

本文关键字:对象 创建 构造函数 终止      更新时间:2023-10-16

可能重复:
如何处理C++中构造函数的失败?

C++中有没有任何模式可以在某个东西失败时终止构造函数中的对象创建?所以调用构造函数的客户端得到了关于对象创建失败的信息?

是的,您可以:抛出异常这几乎是唯一明智的方法。通过选择适当的异常类(标准的或您自己的(并提供一个好的错误消息等,您将能够告诉调用者出了什么问题。

常见问题解答提供了更多详细信息。

您需要抛出一个异常。这是处理对象创建失败的最佳方法。

构造函数失败应该是Herb Sutter的GOTW中的一个有趣的解读。

另一种方法是,如果构造函数遇到错误,设置一个状态位,让用户调用IsOK()来查看构造是否真的有效。

但这被认为是过时的。

赫伯说:

我发现"如果构造函数遇到错误,设置一个状态位,让用户调用IsOK((,看看构造是否真的有效"的方法已经过时、危险、乏味,而且绝不会比抛出异常更好。

抛出异常是处理此问题的常用方法,但是,我不建议您使用在构造函数中抛出异常的模式。

我们不能确保构造函数不会抛出异常,但在我看来,依赖构造函数抛出的异常是一种反模式。有一个细微的区别:(

我通常更喜欢处理不应该失败的构造函数,并在可以返回值或引发异常的Initialize方法中移动可能失败的合理逻辑。

它更干净,当代码变得更复杂时,可以避免你头疼!

这是一个例子,说明了我为什么这么犹豫:http://www.cs.technion.ac.il/~imaman/programs/sthrowingcor.html

另一个有趣的帖子是C++:如果构造函数可能抛出异常,则处理资源(参考FAQ17.4]

正如aix所解释的,从构造函数抛出是唯一明智的选择。

或者,您可以使用命名构造函数习语(请参阅此处和此处(,并在创建新对象失败时返回空指针。