终止构造函数中的对象创建
Terminate object creation in constructor
可能重复:
如何处理C++中构造函数的失败?
C++中有没有任何模式可以在某个东西失败时终止构造函数中的对象创建?所以调用构造函数的客户端得到了关于对象创建失败的信息?
是的,您可以:抛出异常这几乎是唯一明智的方法。通过选择适当的异常类(标准的或您自己的(并提供一个好的错误消息等,您将能够告诉调用者出了什么问题。
常见问题解答提供了更多详细信息。
您需要抛出一个异常。这是处理对象创建失败的最佳方法。
构造函数失败应该是Herb Sutter的GOTW中的一个有趣的解读。
另一种方法是,如果构造函数遇到错误,设置一个状态位,让用户调用IsOK()
来查看构造是否真的有效。
但这被认为是过时的。
赫伯说:
我发现"如果构造函数遇到错误,设置一个状态位,让用户调用IsOK((,看看构造是否真的有效"的方法已经过时、危险、乏味,而且绝不会比抛出异常更好。
抛出异常是处理此问题的常用方法,但是,我不建议您使用在构造函数中抛出异常的模式。
我们不能确保构造函数不会抛出异常,但在我看来,依赖构造函数抛出的异常是一种反模式。有一个细微的区别:(
我通常更喜欢处理不应该失败的构造函数,并在可以返回值或引发异常的Initialize方法中移动可能失败的合理逻辑。
它更干净,当代码变得更复杂时,可以避免你头疼!
这是一个例子,说明了我为什么这么犹豫:http://www.cs.technion.ac.il/~imaman/programs/sthrowingcor.html
另一个有趣的帖子是C++:如果构造函数可能抛出异常,则处理资源(参考FAQ17.4]
正如aix所解释的,从构造函数抛出是唯一明智的选择。
或者,您可以使用命名构造函数习语(请参阅此处和此处(,并在创建新对象失败时返回空指针。
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针