C++类构造函数引发异常

C++ class constructor throwing an exception

本文关键字:异常 构造函数 C++      更新时间:2023-10-16

让我们考虑有一个类,带有构造函数抛出异常,如下所示:

class Class
{
    public:
        Class(type argument)
        {
            if (argument == NULL)
            {
                throw std::exception("Value cannot be null.nParameter name: argument");
            }
            // Instructions
        }
    private:
        // Properties
}

由于构造函数[/strong>可能引发异常,因此我们不能直接声明>对象。

Class obj(argument); // Harmful

这意味着必须调用构造函数。必须使用try/catch

try
{
    Class obj(argument);
}
catch (std::exception& ex)
{
    std::cout << ex.what() << std::endl;
}

问题是,我们只能在try块内使用对象[/strong>。在try块之外使用它的唯一方法是声明一个Class*指针,然后使用new[/strong>关键字来构造一个新的对象,然后将它的地址分配给前一个指针。

Class* pObj;
try
{
    pObj = new Class(argument);
}
catch (std::exception& ex)
{
    std::cout << ex.what() << std::endl;
}

那么,为了在不使用指针或动态内存分配的情况下创建实例,定义以前的的标准方法是什么?

提前感谢

由于类构造函数可能引发异常,我们无法声明直接指向对象。

是的,你可以。如果你真的有一个计划来处理函数中的异常,你只需要把它放在try块中。如果你没有这样的计划,那么就让异常传播吧(尽管你最终应该会发现它,只是为了提供一个报告,如果没有其他的话)。

但是,假设您确实有一个计划来处理函数中的异常,那么解决方案很简单。

try {
    Class obj(argument);
    // use obj here, inside the try block
}
catch(...) { ... }
// not here, outside the try block

编辑:根据你在下面的评论,要么你误解了我,要么我误解了你。也许需要一个具体的例子。假设这是使用类的函数:

void Foobar(type argument)
{
    Class obj(argument);
    obj.method1(1,2,3);
    obj.method2(3,4);
    int x = Wizbang(obj);
    gobble(x);    
}

现在,您想要处理Class构造函数可能引发的异常。我的建议是把所有的垃圾都放在函数中,放在一个尝试块中,这样:

void Foobar(type argument)
{
    try
    {
        Class obj(argument);
        obj.method1(1,2,3);
        obj.method2(3,4);
        int x = Wizbang(obj);
        gobble(x);
    }
    catch(std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}

如果你做不到,请解释原因。您说过"我需要稍后使用该对象的访问权限",但您没有提供任何理由,说明的"稍后"创建该对象的同一尝试块内"稍后"。因此,您的要求是不完整的。

你想要的是不可能的。假设有某种方法可以执行您想要的操作,即,创建一个Class类型的对象obj,该对象仍在用于处理构造函数中异常的任何相关try{}catch{}构造之外的范围内。要问自己的问题是,如果在构造obj的过程中抛出异常,并且您以某种方式处理了该异常,然后在obj仍在作用域中的块中继续执行,那么obj究竟包含什么?它从来没有被建造过,所以物体里会有什么????