2012-05-27 24 views
1

這是一個面試問題,面試已經完成。即使從類中拋出異常,C++程序能否正常工作?

給出A類,B類和C類成員。 如果在C類的構造函數中發生異常,但程序仍然可以正常工作,原因是什麼?

我的回答:

C'S構造不答或執行類,A沒有一些指令對C類執行某些操作

C類沒有任何實例。

異常不是錯誤。異常處理函數很好地處理它。

有什麼更好的點子?

謝謝!

回答

0

程序可以繼續工作,如果設計這樣做的話,但類型A的對象的構造必須失敗,因爲如果對象的任何基礎或成員未能初始化,則不可能完全構建對象。

這將有可能爲一個類來保存由擁有指針的對象,併爲它沒有舉行對象構造提供了厚望不會從initailizer列表逃脫。例如。

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 
    } 
} 
1

如果C實例是A類的可選部件,即具有零值指針C實例是OK。那麼,假設正確的異常處理就沒有問題了。

1

要成功構建一個對象A,您需要成功構建其成員(在此例中爲BC)。如果程序正確使用,這意味着它可以從創建A對象失敗中恢復。

程序必須已經引起了從A的構造函數拋出的異常和處理以某種方式錯誤情況。例如,您可以將一組不同的參數傳遞給A的構造函數(它將不同的參數傳遞給其現在不拋出的成員函數)。基於替代配置值。

或者有一種替代方法可以解決不涉及創建類型爲A的對象的原始問題(例如,這種替代路徑的計算可能更昂貴,這可能是它不是第一選擇的原因) 。

1

我認爲這就是指這樣的語法:

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

編輯沒關係,每個異常catch塊中沒有明確重新拋出自動重新拋出

this