gpt4 book ai didi

c++ - 在具有异常处理的函数中返回一个类

转载 作者:行者123 更新时间:2023-11-30 02:27:39 25 4
gpt4 key购买 nike

假设我有一个旨在返回类的函数,但是,我希望在调用构造函数时使用异常处理。问题是,在出现异常的情况下,我想返回的类超出了范围,我没有什么可返回的:

myclass GetClass() {
try {
myclass classtoreturn(7);
return classtoreturn;
} catch ( const std::exception& ex ) {
//
} catch ( const std::string& str ) {
//
} catch (...) {
//
}

return ??;
}

但是,如果我在 try/catch 之外声明类,我将遇到返回未初始化类的问题:

myclass GetClass() {
myclass classtoreturn;
try {
classtoreturn(7);
return classtoreturn;
} catch ( const std::exception& ex ) {
//
} catch ( const std::string& str ) {
//
} catch (...) {
//
}

return classtoreturn; //Unitialized!
}

我的第一个建议是返回一个指针,并在发生异常时返回一个 NULL 指针,但是指针将指向一个超出范围的类,这仍然不好。这似乎是一个常见问题,但我还没有偶然发现解决方案。

还有,实际应用可以看here ,我试图将 gpsmm 类返回到我的主函数,以便稍后可以将其作为指向轮询函数的指针传递。

谢谢!


好的,现在阅读一些回复我认为在调用者处捕获异常是有意义的,但是,我认为这只是将问题传播给调用者:

void main() {
try{
myclass classforuse{ GetClass() };
} catch (...) {
//
}

//Want to do something with "classforuse" but it's out of scope!
}

据我所知,当我声明它时,该类将被构造,所以我无法从 try{} 中构造一个类,然后在不使用 std/boost 的情况下在同一个 try{} 的范围之外使用它::选修的。那是对的吗?我认为 boost 库将是我唯一的选择,除非我找到一种实用的方法在同一个 try{} 中使用该类。谢谢

最佳答案

有几种方法可以处理这个问题。第一个是更改返回函数的返回类型,而不是通过 std::unique_ptr 传递值来返回类。 std::unique_ptr 可以是 null 所以如果有异常你可以返回一个 null unique_ptr 否则你只是将 unique_ptr 返回给你的对象已创建。

另一种选择是使用 boost::optionalstd::optional .您现在可以使用 boost::optional,但 std::optional 是 C++17 功能,因此它的可用性受到限制。就我个人而言,我更喜欢可选方法,因为它更多地通过类型来描述情况。 可选 还有一个额外的好处,即没有动态内存分配。

最后,您无法恢复并抛出函数。这将向调用者发出信号,表明发生了某些事情,但他们没有得到返回的对象。

关于c++ - 在具有异常处理的函数中返回一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41464348/

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