让我们考虑使用 类 构造函数 投掷 异常 如下:
class Class
{
public:
Class(type argument)
{
if (argument == NULL)
{
throw std::exception("Value cannot be null.\nParameter name: argument");
}
// Instructions
}
private:
// Properties
}
由于 类 构造函数 可能会抛出 异常 < / strong>我们无法直接声明 对象 。
Class obj(argument); // Harmful
这意味着必须调用 构造函数 必须使用 try / catch
try
{
Class obj(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
问题是我们只能在 尝试 块中使用 对象 。在 尝试 块之外使用它的唯一方法是声明 Class * 指针 < / strong>然后使用 新 关键字构建新的 对象 ,然后将其地址分配给之前的 指针
Class* pObj;
try
{
pObj = new Class(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
那么定义前一个 类 的标准方法是什么,以便在不使用 指针的情况下创建实例 还是动态内存分配?
提前谢谢
答案 0 :(得分:4)
由于类构造函数可能抛出异常,因此我们无法声明 一个直接的对象。
是的,你可以。如果你真的有计划在函数中处理异常,你只需要把它放在一个try块中。如果你没有这样的计划,那么就让异常传播(尽管你最终应该抓住它,只是为了提供一份报告,如果没有其他的话)。
但是,假设您确实有计划在函数中处理异常,那么解决方案很简单。
try {
Class obj(argument);
// use obj here, inside the try block
}
catch(...) { ... }
// not here, outside the try block
编辑:通过下面的评论,你要么误解我,要么误解了你。也许需要一个具体的例子。让我们说这是你使用你的班级的功能:
void Foobar(type argument)
{
Class obj(argument);
obj.method1(1,2,3);
obj.method2(3,4);
int x = Wizbang(obj);
gobble(x);
}
现在,您想要处理Class
构造函数可能抛出的异常。我所建议的是将所有垃圾放入一个try块中,然后将其放入try块中:
void Foobar(type argument)
{
try
{
Class obj(argument);
obj.method1(1,2,3);
obj.method2(3,4);
int x = Wizbang(obj);
gobble(x);
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
}
}
如果你不能这样做,请解释原因。您已经说过&#34;我需要访问权限以便稍后使用该对象&#34; ,但您没有提供为什么&#34;以后&#34; 并不意味着&#34;稍后在创建对象的同一个try块中#34; 。因此,您的要求不完整。
答案 1 :(得分:0)
你想要的不是(合理地)可能的。假设有一些方法可以做你想要的,也就是说,创建一个Class类型的对象obj,它仍然在任何相关的try {} catch {}构造之外,用于处理构造函数中的异常。问自己的问题是,如果在构造obj期间抛出异常,并且你以某种方式处理异常然后执行将继续在obj仍然在范围内的块中,obj究竟包含什么?它从未构建过,所以只是在obj ????
中