让我们考虑让一个带有构造函数的类抛出如下异常:
class Class
{
public:
Class(type argument)
{
if (argument == NULL)
{
throw std::exception("Value cannot be null.\nParameter name: argument");
}
// Instructions
}
private:
// Properties
}
由于类 构造函数可能会引发异常,因此我们无法直接声明对象。
Class obj(argument); // Harmful
这意味着必须使用try / catch来调用构造函数
try
{
Class obj(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
问题是我们只能在try块内使用对象。在try块之外使用它的唯一方法是声明一个Class *指针,然后使用new关键字构造一个新对象,然后将其地址分配给前一个指针。
Class* pObj;
try
{
pObj = new Class(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
那么,定义上一个类以创建实例而不使用指针或动态内存分配的标准方法是什么?
先感谢您
由于类构造函数可能会引发异常,因此我们无法直接声明对象。
是的你可以。如果您确实有计划在函数中处理异常,则只需将其放在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块,从而:
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;
}
}
如果您无法执行此操作,请说明原因。您已经说过“我以后需要访问权限才能使用该对象”,但是您没有提供任何理由说明“稍后”不能表示“稍后在创建对象的同一try块中”。因此,您的要求不完整。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句