1

这是一个面试问题,面试已经完成。

给定一个A类,其中有B类和C类的成员。如果C类的构造函数发生异常,但程序仍然可以正常运行,原因是什么?

我的答案:

类 C 的构造函数不是由 A 实现的。或者,A 没有一些指令来对类 C 执行一些操作。

C 类没有任何实例化。

异常不是错误。异常处理函数处理得很好。

有更好的主意吗?

谢谢 !

4

4 回答 4

1

如果一个实例C是 class 的可选成员A,则具有指向C实例的空值指针是可以的。那么,假设正确的异常处理就没有问题了。

于 2012-05-27T15:17:48.110 回答
1

要成功构造 的对象A,您需要成功构造其成员(在本例中为类型BC)。如果程序正常工作,这意味着它可以从创建A对象的失败中恢复。

程序必须已经捕获了从A的构造函数抛出的异常,并以某种方式处理错误情况。

例如,您可以将一组不同的参数传递给A的构造函数(这反过来又将不同的参数传递给它的C成员 ctor,它现在不会抛出),例如基于替代配置值。

或者有一个替代路径来解决不涉及创建类型对象的原始问题A(例如,这个替代路径的计算成本可能更高,这可能是它不是首选的原因)。

于 2012-05-27T15:17:54.190 回答
1

我认为它指的是这种语法:

 A::A() try : B(...),C(...) 
 {
    //A constructor body
 }
 catch(...) {}

编辑没关系,在 catch 块中未明确重新抛出的每个异常都会自动重新抛出

看到这个

于 2012-05-27T15:20:27.317 回答
0

如果设计为这样,程序可以继续工作,但类型 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
    }
}
于 2012-05-27T15:17:43.243 回答