![]() |
1
26
最好的建议可能是Parashift所说的。但请阅读下面我的注意事项。
在构造函数中引发异常时的注意事项: 但是要非常小心,因为如果在构造函数中抛出异常,则不会调用类的析构函数。因此,在抛出异常之前,您需要小心地销毁已经构造的对象。一般来说,同样的警告也适用于异常处理,但在处理构造函数时,它可能不太明显。
使用CreateInstance方法的受保护/私有构造函数: 另一种解决方法是将构造函数设置为私有或受保护,并创建一个可返回错误的CreateInstance方法。 |
![]() |
2
7
您可以像其他人提到的那样抛出一个异常,或者您也可以重构您的代码,这样您的构造函数就不会失败。例如,如果您正在处理一个禁用或不允许异常的项目,那么后者是您的最佳选择。
若要生成不能失败的构造函数,请将可能失败的代码重构为
当然,这有点危险,因为程序员可能忘记调用
|
![]() |
3
4
一般来说,您应该抛出一个异常。另一种选择是拥有一些半正确构造的对象,用户必须以某种方式对其进行测试,而这将不可避免地失败。 |
![]() |
4
2
如果您正在构造的对象由于错误而无效,并且需要由调用方处理,那么您几乎必须抛出异常。这允许编译器执行正确的资源释放。 (编写异常安全的构造函数需要一点注意——简而言之,您需要尽可能地使用初始值设定项列表,而不是使用构造函数主体——但是,如果您遇到这样的情况,抛出异常的可能性很大,这一点很关键。) |
![]() |
5
1
如果你在错误之后拒绝了它,你就不能执行它的操作-你必须抛出。如果它可以记录您的错误并更改构造逻辑。 |
![]() |
6
0
引发异常。请在此处查看更多信息: Handling error in constructor |
![]() |
7
0
只有一个好方法可以从出错的构造函数中退出,即引发异常。 这真的是个错误吗?您是否试图向构造函数添加太多内容? 通常,人们会尝试将一些初始交互转入构造函数,比如将文件名添加到文件构造函数中。是否希望它立即打开该文件,或者您只是设置了某种状态,它与file.open(文件名)是否不同,如果失败是否正常? |
![]() |
8
0
最好是抛出一个异常。这就是他们的目的,任何试图复制你得到的行为的尝试都可能在某个地方失败。
如果由于某种原因无法使用异常,请使用
从技术上讲,这是一种新的放置形式,但是它应该返回一个完全成形的对象或者一个需要测试的空指针,除非没有人会这样做。 如果您的类可以有一个存在但未正确初始化的对象,那么您可以有一个数据成员作为标记来判断该类是否有用。同样,没有人会在实时代码中检查该标志。 请记住,如果您确实需要一个保证不会失败的分配,那么您需要提前分配内存并使用placement new,并删除可能会抛出到另一个例程的所有初始化,而其他人将无法调用该例程。分配内存的任何东西都可能失败,特别是在那些通常不支持异常的更为有限的系统上。 事实上,例外是最好的方式。 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 3 年前 |
![]() |
nick2225 · 隐式调用复制构造函数? 3 年前 |
![]() |
nohaga · 为什么在本例中p3需要默认构造函数? 3 年前 |
![]() |
Aadil Hoda · 为什么类类型的成员需要初始化? 3 年前 |
![]() |
EloiGG · 具有任意类型的变量的可数的C++函数 3 年前 |