M. *_*ley 9 c++ constructor exception raii
我有一个类可以在其构造函数中抛出异常.如何在try/catch块中声明该类的实例,同时仍然可以在正确的范围内使用它?
try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }
lMyObject.DoSomething(); // lMyObject not in scope!
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法可以实现这一点,同时尊重RAII成语?
我不想使用init()两阶段构造的方法.我能想到的另一件事是:
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }
std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
Run Code Online (Sandbox Code Playgroud)
工作正常,但我对范围和指针间接的原始指针不满意.这只是另一个C++疣吗?
如果构造函数抛出这意味着该对象无法初始化,因此无法启动它的存在.
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (std::exception e) { /* Handle constructor exception */ }
Run Code Online (Sandbox Code Playgroud)
在上面,如果构造函数抛出异常,lMyObject则保持未初始化,换句话说,指针包含一个不确定的值.
有关详细说明,请参阅经典构造函数失败:
我们可以总结一下C++构造函数模型如下:
或者:
(a)构造函数通常在到达其结尾或返回语句时返回,并且该对象存在.
要么:
(b)构造函数通过发出异常退出,并且该对象不仅现在不存在,而且从未存在过.
没有其他可能性.
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |