2017-05-28 43 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已被适当地构造(即从不执行应用程序的逻辑,直到对象的构造成功),或者如果它必须测试失败的可能性。