这是一个面试问题,面试已经完成。
鉴于A级成员为B级和C级成员。 如果在C类的构造函数中发生异常但程序仍然可以正常工作,那么原因是什么?
我的回答:
C类的构造函数不是由A实现的。或者,A没有一些指令来对C类执行某些操作。
C类没有任何实例化。
异常不是错误。异常处理函数处理得很好。
有更好的想法吗?
谢谢!
答案 0 :(得分:1)
如果C
的实例是类A
的可选成员,那么具有指向C
实例的空值指针就可以了。然后,假设适当的异常处理就没有问题。
答案 1 :(得分:1)
要成功构建A
的对象,您需要成功构建其成员(在本例中为B
和C
类型)。如果程序正确运行,则意味着它可以从创建A
对象失败中恢复。
程序必须捕获从A
的构造函数抛出的异常并以某种方式处理错误情况。
例如,您可以将一组不同的参数传递给A
的构造函数(后者又将不同的参数传递给其C
成员ctor,现在它不会抛出),例如基于替代配置值。
或者有一个替代路径来解决原始问题而不涉及创建类型A
的对象(例如,这个替代路径的计算成本可能更高,这可能是因为它不是第一选择)。
答案 2 :(得分:1)
我认为这是指这种语法:
A::A() try : B(...),C(...)
{
//A constructor body
}
catch(...) {}
编辑没关系,每个未在catch块中显式重新抛出的异常都会自动重新抛出
请参阅this
答案 3 :(得分:0)
如果设计的话,程序可以继续工作,但是类型A的对象的构造必须失败,因为如果对象的任何基础或成员初始化失败,则不可能完全构造对象。 / p>
一个类可以通过拥有指针来保存一个对象,并且可以在没有保持对象的情况下构造它,前提是它不会从initailizer列表中逃脱。 E.g。
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
}
}