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

时间:2011-10-25 18:42:07

标签: c++

  

可能重复:
  How to handle failure in constructor in C++?

C ++中是否有任何模式,所以如果出现故障,我可以在构造函数中终止对象创建?那么调用构造函数的客户端获得了有关失败的obj创建的信息?

4 个答案:

答案 0 :(得分:11)

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

常见问题解答has more details

答案 1 :(得分:5)

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

Constructor Failures 应该是Herb Sutter的GOTW的有趣读物。

另一种方法是,如果构造函数遇到错误,请设置状态位并让用户调用IsOK()以查看构造是否实际有用。

但这被视为已过时

赫布说:

  

我发现“如果构造函数遇到错误,设置一个状态位并让用户调用IsOK()来查看构造是否实际工作”方法过时,危险,乏味,并且绝不比抛出更好例外。

答案 2 :(得分:1)

抛出异常是处理异常的常用方法,但是,我不鼓励你从构造函数中抛出异常的模式。

我们无法确保构造函数不会抛出异常,但在我看来依赖于构造函数抛出的异常的反模式。 有一个微妙的区别:)

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

当代码变得更复杂时,它更干净并避免让您头疼!

这就是为什么我这么说的例子:http://www.cs.technion.ac.il/~imaman/programs/throwingctor.html

另一篇有趣的帖子是C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]

答案 3 :(得分:1)

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

或者,您可以使用 Named Constructor Idiom (请参阅herehere)并在新对象的创建以失败告终时返回空指针。