如何使用在 try 块内部和外部创建的对象?

Saa*_*med 1 c++ oop exception try-catch

假设我在 try 块内创建了一个对象,因为我想捕获从它的构造函数抛出的异常,那么我如何能够在该块之外使用该对象?

//Inputs given to t5 can throw an exception from the constructor.
    try {
        Time t5(23, 59, 59);
    }
    catch (invalid_argument& e) {
        cerr << "\n\nException while initializing t5: " << e.what() << endl;
    }
Run Code Online (Sandbox Code Playgroud)

在引发异常的情况下,我可能不需要使用它,但在没有引发异常的情况下,我肯定会需要它,但在块内创建的对象在外部无法访问。我能想到的一种解决方案是在块之外创建对象,然后为其分配一个 R 值对象,我通过显式调用构造函数来创建该对象,如下所示:

    Time t5;
    try {
        t5 = Time(23, 59, 59);
    }
    catch (invalid_argument& e) {
        cerr << "\n\nException while initializing t5: " << e.what() << endl;
    }
Run Code Online (Sandbox Code Playgroud)

但这是在做不必要的事情,例如创建另一个对象只是为了尝试捕获异常。还有更好的方法吗?另外,从构造函数抛出异常是一种不好的编程习惯吗?PS:我看到有人问了类似的问题,但对于 C# 来说,给出的解决方案与我想出的解决方案相同,但我相信应该有更好的方法,正如我上面解释的那样。谢谢。

Hol*_*Cat 9

取决于默认构造函数的类型Time。如果它的构造函数只是将三个数字归零,那么您的解决方案就可以。

如果它的默认构造函数很昂贵(或者根本不存在),您可以将其放入std::optional

std::optional<Time> t5;
try
{
    t5.emplace(23, 59, 59);
}
// ...
Run Code Online (Sandbox Code Playgroud)