1
7
如果不想使用异常,有两种方法可以让调用方知道构造函数是否成功:
如果使用这些技术中的任何一种,请确保析构函数可以处理构造函数失败的实例。 |
2
4
没有例外的C++本质上是一种完全不同于C++的语言,其中许多给C++独特表达力的成语都显得无能为力。正如您所指出的,构造函数被剥夺了它们的实用性,并且所有重要的初始化都必须移动到第二阶段的伪构造函数中,该伪构造函数可以返回错误指示。(有些人还提倡一个匹配的伪析构函数出于错误的对称感,但这是完全没有意义的)。或者,构造函数可以在成功时设置一个“constructed”标志,并且每个类都可以有一个“constructed”方法来检查这个方法及其所有子类。 如果您的公司要求您禁用异常,那么您还需要一个公司范围(或者至少是项目范围)的约定来替换它。您需要为所有要返回的(非琐碎的)函数定义一个类型,并且在任何地方都一致地使用它——否则,您将得到一个不可维护的Boolean和不兼容的枚举的大杂烩,并在每个级别上进行传递和手动转换。
在这种情况下,
|
3
3
没有一个好的方法;这是他们最初被添加到语言中的主要原因之一。无例外:
就我个人而言,我认为2严格地比3好,因为它不会增加类的大小,并且在不调用“check”函数时更容易看到它。我听到引用的原因有很多,比如您可以访问虚拟函数,但我一直认为这相当弱。 |
4
3
避免在构造函数或说明中使用导致失败的代码是安全的。再让一个成员说,
|
5
2
为什么不应使用例外?从构造函数返回错误的最佳方法是抛出异常。错误构造的对象不应该使用,抛出异常可以确保这一点。 您可以参考此常见问题解答: How can I handle a constructor that fails? |
6
2
这很难看,我并不推荐, 但是 如果不允许抛出构造函数,则可以有一个哑构造函数和一个init函数:
|
7
2
我尝试了所有我能找到的异常的替代方法(成员错误变量,甚至setjmp/longjmp),它们都以自己独特的方式被吸进了其中。我喜欢的一种非常不常见的模式是将一个引用传递给周围的错误对象,并检查错误是否作为任何函数中的第一个操作挂起:
在某些工作中,它也适用于构造函数:
主要问题是,如果动态分配对象的构造函数失败,则不会自动删除。我通常将new的调用包装在如下函数中:
使用方法如下:
这种技术的优点包括:
|
8
0
两个建议:
|
9
0
|
10
0
我也遇到了这个问题。我认为一个优雅的解决方案是使真正的构造函数私有化,然后使用工厂返回实例和错误。 我不喜欢通过输出参数检索错误,所以我将成功和可能的实例放在结构中:
这是一种流行的模式,被提议作为标准的扩展。这样做的好处是您的代码仍然可以大量使用RAII。 我建议你看安德烈·亚历山大的 talk on systematic error handling in C++ . |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
nick2225 · 隐式调用复制构造函数? 2 年前 |
nohaga · 为什么在本例中p3需要默认构造函数? 2 年前 |
Aadil Hoda · 为什么类类型的成员需要初始化? 2 年前 |
EloiGG · 具有任意类型的变量的可数的C++函数 2 年前 |