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

鲁鲁夫

让我们考虑让一个带有构造函数抛出如下异常

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

            // Instructions
        }
    private:
        // Properties
}

由于 构造函数可能会引发异常,因此我们无法直接声明对象

Class obj(argument); // Harmful

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

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

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

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构造函数可能引发的异常我的建议是将函数中的所有垃圾放入try块,从而:

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

如果您无法执行此操作,请说明原因。您已经说过“我以后需要访问权限才能使用该对象”,但是您没有提供任何理由说明“稍后”不能表示“稍后在创建对象的同一try块中”因此,您的要求不完整。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

使用move构造函数引发异常?(C ++)

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

我应该在哪里捕获构造函数中引发的C ++异常?

来自分类Dev

当构造函数引发异常并使用自定义new时,C ++如何释放内存

来自分类Dev

当构造函数引发异常并使用自定义new时,C ++如何释放内存

来自分类Dev

C ++,处理构造函数的异常

来自分类Dev

C ++重载异常的构造函数

来自分类Dev

基类的c ++构造函数

来自分类Dev

我正在尝试创建一个使用C ++中的参数包构造函数的异常类

来自分类Dev

C#-创建一个其构造函数采用通用参数的类,导致转换异常

来自分类Dev

Java构造函数引发异常的类的子类化

来自分类Dev

C ++在构造函数中捕获异常

来自分类Dev

堆栈对象的C ++构造函数异常处理

来自分类Dev

调用构造函数时异常的C ++行为

来自分类Dev

使用cython从C ++构造函数传播异常

来自分类Dev

构造函数中的异常 - C++

来自分类Dev

具有构造函数的简单类会引发警告:ISO C ++禁止将字符串常量转换为'char *'

来自分类Dev

C ++类,构造函数和函数

来自分类Dev

目标C类方法== C ++构造函数?

来自分类Dev

C#类和实例构造函数

来自分类Dev

派生类的C ++ CRTP构造函数

来自分类Dev

玩类,对象和构造函数/ C ++

来自分类Dev

C ++-派生类构造函数的行为

来自分类Dev

C#中的类构造函数

来自分类Dev

构造函数中使用lambda的C ++类

来自分类Dev

模拟复制构造函数的C ++类

来自分类Dev

C ++错误,类和构造函数

来自分类Dev

C ++类之间的转换构造函数