这是一个面试问题,面试已经完成。
给定一个A类,其中有B类和C类的成员。如果C类的构造函数发生异常,但程序仍然可以正常运行,原因是什么?
我的答案:
类 C 的构造函数不是由 A 实现的。或者,A 没有一些指令来对类 C 执行一些操作。
C 类没有任何实例化。
异常不是错误。异常处理函数处理得很好。
有更好的主意吗?
谢谢 !
这是一个面试问题,面试已经完成。
给定一个A类,其中有B类和C类的成员。如果C类的构造函数发生异常,但程序仍然可以正常运行,原因是什么?
我的答案:
类 C 的构造函数不是由 A 实现的。或者,A 没有一些指令来对类 C 执行一些操作。
C 类没有任何实例化。
异常不是错误。异常处理函数处理得很好。
有更好的主意吗?
谢谢 !
如果一个实例C
是 class 的可选成员A
,则具有指向C
实例的空值指针是可以的。那么,假设正确的异常处理就没有问题了。
要成功构造 的对象A
,您需要成功构造其成员(在本例中为类型B
和C
)。如果程序正常工作,这意味着它可以从创建A
对象的失败中恢复。
程序必须已经捕获了从A
的构造函数抛出的异常,并以某种方式处理错误情况。
例如,您可以将一组不同的参数传递给A
的构造函数(这反过来又将不同的参数传递给它的C
成员 ctor,它现在不会抛出),例如基于替代配置值。
或者有一个替代路径来解决不涉及创建类型对象的原始问题A
(例如,这个替代路径的计算成本可能更高,这可能是它不是首选的原因)。
我认为它指的是这种语法:
A::A() try : B(...),C(...)
{
//A constructor body
}
catch(...) {}
编辑没关系,在 catch 块中未明确重新抛出的每个异常都会自动重新抛出
看到这个
如果设计为这样,程序可以继续工作,但类型 A 的对象的构造必须失败,因为如果对象的任何基或成员未能初始化,则不可能完全构造对象。
如果期望不会从初始化器列表中逃脱,则类可以通过拥有指针持有对象,并且可以在没有持有对象的情况下构造它。例如
struct C {
C();
};
struct A {
A();
std::unique_ptr<C> c;
};
A::A() {
try {
c.reset(new C);
}
catch (...){
// oops. Can't re-throw, could log
}
}