2017-05-28 55 views
0

我很難找到一個解決方案,這將允許我在捕獲一個潛在的初始化異常的同時保持對象的作用域爲main方法。嘗試catch類的變量初始化的範圍

下面的僞代碼試圖最好地說明我的問題。

int main() { 
    // Initialisation 
    SomeObject * object; 

    try { 
     SomeObject obj; // Initialisation can cause an exception 
     object = &obj; 
    } 
    catch (SomeException &ex) { 
     // Handle exception 
    } 

    // object out of scope undefined behaviour 

    // Application Logic 
    return 0; 
} 

據我所知,對象將再次在try塊結束時被刪除,所以使用指針時,會導致不確定的行爲。

我該如何做這樣的事情,並將對象傳遞給函數作用域,以便對象不被刪除?

我可以在我的項目中使用C++ 14解決方案。

+0

'保持的物體的範圍本地到主方法「 - 爲什麼在這種情況下,而不是十年把它放在你想要使用它的範圍內?如果你在子函數中聲明瞭對象作爲局部變量 - 在你從這個子函數退出到'main'之後,任何方法都會被廢棄。所以如果你需要在'main'範圍內有對象 - 在這裏聲明 – RbMm

回答

1

我該如何做這樣的事情,並將對象傳遞給函數作用域,以便對象不被刪除?

您可以使用,而不是智能指針:

int main() { 
    // Initialisation 
    std::unique_ptr<SomeObject> object; 

    try { 
     object = std::make_unique<SomeObject>(); // Initialisation can cause an exception 
    } 
    catch (SomeException &ex) { 
     // Handle exception 
    } 

    if(object) { 
     // Application Logic 
    } 
    return 0; 
} 
+0

謝謝,我相信這是我所需要的。 –

0

最顯而易見的方法將是「功能try塊」

int main() try 
{ 
    SomeObject object; 

    // Application logic - able to use object 

    return 0; 
} 
catch (SomeException &ex) 
{ 
    // Handle exception 
} 

這使得異常處理程序終止之前清理。

如果你想內main()異常處理程序,那麼一種選擇是

int main() 
{ 
     try 
     { 
      SomeObject object; 

      // Application logic able to use object 
     }  
     catch (SomeException &ex) 
     { 
      // Handle exception 
     } 
} 

通過適當的控制結構(一環內如整個try/catch),可以爲catch塊從恢復錯誤和重新開始。如果你真的希望對象的定義和初始化是分開的,你可以做類似於(C++ 11和更高版本)的東西;

#include <memory> 
int main() 
{ 
    std::unique_ptr<SomeObject> object; 

    try 
    { 
      object = std::make_unique<SomeObject>(); 
    } 
    catch (SomeException &ex) 
    { 
     // Handle exception 
    } 

    // code here cannot assume construction of object succeeded 

    if (object) 
    { 
     // Application Logic can assume object is properly constructed 
    } 
    return 0; 
} 

之前C++ 11,上面可使用std::auto_ptr(這是C++ 11贊成unique_ptr棄用英寸

合適選擇取決於是否要在「應用程序邏輯」到能夠假設object已被適當地構造(即從不執行應用程序的邏輯,直到對象的構造成功),或者如果它必須測試失敗的可能性。