可能重复:
How to handle failure in constructor in C++?终止对象创建在构造函数中
是否有任何模式在C++中,我就可以在构造函数中终止创建对象,如果事情失败了呢?那么调用构造函数的客户端获得了关于失败的obj创建的信息?
可能重复:
How to handle failure in constructor in C++?终止对象创建在构造函数中
是否有任何模式在C++中,我就可以在构造函数中终止创建对象,如果事情失败了呢?那么调用构造函数的客户端获得了关于失败的obj创建的信息?
是的,你可以:抛出异常。这几乎是唯一明智的方法。通过选择合适的异常类(无论是标准还是自己的)并提供良好的错误信息等,您都可以告诉调用者出了什么问题。
FAQ has more details。
您需要抛出异常。这是处理失败对象创建的最佳方法。
Constructor Failures应该是Herb Sutter的GOTW中有趣的读物。
这样做的另一种方法是,如果构造函数遇到错误,请设置状态位并让用户调用IsOK()
来查看构造是否真正起作用。
但是这被认为是陈旧的。
赫伯说:
我已经找到了,“如果一个构造函数遇到错误,设置一个状态位,让用户调用ISOK(),看看是否建设的实际工作”已经过时,危险方法,单调乏味,绝不比抛出异常更好。
抛出一个异常是处理该异常的常用方法,但是,我劝阻你从构造函数中抛出异常的模式。
我们不能确保构造函数不会抛出异常,但在我看来依赖构造函数抛出的异常的反模式。 有一个微妙的区别:)
我通常更喜欢处理不应该失败的构造函数,并移动在可以返回值或抛出异常的Initialize方法中失败的合理逻辑。
它更干净,避免你在代码变得更加复杂的时候头疼!
这就是为什么我这么blieve一个例子:http://www.cs.technion.ac.il/~imaman/programs/throwingctor.html
另一个有趣的帖子是C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]
我没有downvote,但是,你不能总是写一个不能失败的构造函数。我想你是在暗示两个对Symbian使用的两阶段构造。 –
是的,你不可能总是写一个不能失败的构造函数,但是从我的角度来看,避免依赖构造函数抛出的异常是一种好的做法。一个例子当然是内存不足。 –
我必须承认,像两个分阶段构建方法,不是所有的类,但在处理文件或大量的内存或互联网连接的类似乎是我的最佳选择。我不知道Symbian使用这种方法,但我发现它被用于很多语言和库(C++,C#和Java)。 –
@userbb:请注意,任何完全构造的成员将被破坏,但对象本身的析构函数将不会被调用。 –