gpt4 book ai didi

c++ - RAII 捕获构造函数异常的方法

转载 作者:可可西里 更新时间:2023-11-01 16:38:51 27 4
gpt4 key购买 nike

我有一个类可以在其构造函数中抛出异常。如何在 try/catch block 中声明该类的实例,同时仍使其在正确的范围内可用?

try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }

lMyObject.DoSomething(); // lMyObject not in scope!

在尊重 RAII 的同时,是否有其他方法可以实现这一点?成语?

我不希望将 init() 方法用于两阶段构造。我唯一能想到的另一件事是:

MyClass* lMyObject;

try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }

std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();

工作正常,但我对范围内的原始指针和指针间接寻址不满意。这只是另一个 C++ 疣吗?

最佳答案

如果构造函数抛出异常,则意味着对象无法初始化,因此无法启动它的存在。

MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (std::exception e) { /* Handle constructor exception */ }

在上面如果构造函数抛出异常,lMyObject 将保持未初始化状态,换句话说,指针包含一个不确定的值。

看经典Constructor Failures 详细解释:

We might summarize the C++ constructor model as follows:

Either:

(a) The constructor returns normally by reaching its end or a return statement, and the object exists.

Or:

(b) The constructor exits by emitting an exception, and the object not only does not now exist, but never existed.

There are no other possibilities.

关于c++ - RAII 捕获构造函数异常的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com