在Try-Catch中重复使用已声明的变量

4

我正在使用以下这种try-catch块:

try {

    Texture heightmapTexture = Texture("Snow0101_7_M.jpg");

} catch (TextureLoadException exc) {
    std::cout << exc.what() << std::endl;
}

事实上,我需要在程序中进一步重用变量heightmapTexture。所以我意识到由于范围的限制,我无法这样做。我应该将程序的其余部分放在该范围内吗?对我来说,这没有任何意义。
我也无法在范围外声明变量,因为我必须对其进行初始化。它有一个只接收字符串输入的构造函数。
什么是最好的解决方案?
我意识到我可以使用指针,但我试图避免这样做(我并不真正擅长防止内存泄漏)。
编辑:抱歉,我错误地将变量声明为Heightmap类,它是一个纹理对象。但问题是一样的。

1
使用boost::shared_ptr代替裸指针,可以避免内存泄漏并解决问题。 - vishal129
一个可以初始化但不能赋值的对象?你能修改那个类吗? - Silicomancer
你是什么意思,@Silicomancer?我猜这将不得不是一个指针。 - lhahn
你能修改 Heightmap 类的源代码吗? - Silicomancer
啊,这个对象有绑定和解绑纹理的两种方法。 - lhahn
显示剩余2条评论
2个回答

2

通常情况下,您希望将所有逻辑都放在一个try / catch上下文中。假设纹理的加载失败,则其后的所有操作也将失败?

在这种情况下,您可以更漂亮地表达逻辑:

try {
    Heightmap heightmapTexture = Texture("Snow0101_7_M.jpg");

    // do your work here

    // if anything fails fatally, throw

    // do you need to store the height map in an object?
    my_object.give_heightmap(std::move(heightmapTexture));
} 
// report failures here
catch (TextureLoadException& exc) { // note: by reference
    std::cout << exc.what() << std::endl;
}
catch (OtherReason& e) {
    // report the reason
}
catch(exception& e) {
  // other failures
}

一个好的异常处理思路是,异常对象是对于一个过程或序列失败的解释,而不是每个异常都是一个操作的错误代码。

0

像这样在 try-catch 块之外声明您的变量。

Heightmap *heightmapTexture = null;

try {

    heightmapTexture = new Texture("Snow0101_7_M.jpg");

} catch (TextureLoadException exc) {
    std::cout << exc.what() << std::endl;
}

我不能在C++中做到那个。 - lhahn
1
不行!首先,这要求Heightmap有一个默认构造函数。其次,这违背了异常处理的目的。 - Richard Hodges
1
裸指针很危险,请勿使用。 - Richard Hodges
@RichardHodges 这里不需要默认构造函数。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接