C++类构造函数引发异常
C++ class constructor throwing an exception
让我们考虑有一个类,带有构造函数抛出异常,如下所示:
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;
}
问题是,我们只能在try块内使用对象[/strong>。在try块之外使用它的唯一方法是声明一个Class*指针,然后使用new[/strong>关键字来构造一个新的对象,然后将它的地址分配给前一个指针。
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
构造函数可能引发的异常。我的建议是把所有的垃圾都放在函数中,放在一个尝试块中,这样:
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;
}
}
如果你做不到,请解释原因。您说过"我需要稍后使用该对象的访问权限",但您没有提供任何理由,说明的"稍后"创建该对象的同一尝试块内"稍后"。因此,您的要求是不完整的。
你想要的是不可能的。假设有某种方法可以执行您想要的操作,即,创建一个Class类型的对象obj,该对象仍在用于处理构造函数中异常的任何相关try{}catch{}构造之外的范围内。要问自己的问题是,如果在构造obj的过程中抛出异常,并且您以某种方式处理了该异常,然后在obj仍在作用域中的块中继续执行,那么obj究竟包含什么?它从来没有被建造过,所以物体里会有什么????
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- C++:如何捕获构造函数引发的异常?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 为什么要抛出引用调用复制构造函数的异常?
- std::vector 默认构造函数可以抛出异常吗?
- 如何防止构造函数在引发异常时创建对象
- 当构造函数的参数类型错误时引发异常
- 异常构造函数中的例外
- C++11 引入了采用 'const char*' 的异常构造函数.但是为什么
- 在异常构造函数中参数化错误消息是一种好的做法吗
- 异常构造函数来填充字符串流