如果在成员中抛出异常,则删除母对象

delete mother object if exception thrown in member

我有以下问题:

如果在其中一个成员的构造函数中抛出异常,我想删除一个母对象。 我该怎么做?

以下不是我想要的。正好你有东西可以参考...

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        try{
            if(i > 9) throw 0;
        }catch(int x) { std::cout << "mem max size 9\n"; return;}
        mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    :mem(i)
    {
    }

    const A mem;

};

int main()
{

    B b1(2);
    B b2(10);

    std::cout << "b1: " << b1.mem.mem << std::endl;
    std::cout << "b2: " << b2.mem.mem << std::endl;

}

//~ output:
//~ mem max size 9
//~ b1: 2
//~ b2: 0

编辑

根据 this link 我更改了我的代码如下

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        if(i > 9) throw 0;
        else mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    try
    :mem(i)
    {
    }
    catch(int e)
    {
        std::cerr << "Error #" << e << std::endl;
    }

    const A mem;
};

int main()
{
    B b1(2);
    B b2(10);
}

//~ output:
//~ Error #0
//~ terminate called after throwing an instance of 'int'
//~ Aborted

但是,我不希望程序中止...我该如何防止这种情况发生?

如果我这样做,程序不会中止,但 B 对象正在构造,尽管有异常...

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        try
        {
            if(i > 9) throw 0;
        }
        catch(int e)
        {
            std::cerr << "A Error #" << e << std::endl; return;
        }
         mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    try
    :mem(i)
    {
    }
    catch(int e)
    {
        std::cerr << "Error #" << e << std::endl;
    }

    const A mem;
};

int main()
{

    B b1(2);
    B b2(10);

    std::cout << "b1: " << b1.mem.mem << std::endl;
    std::cout << "b2: " << b2.mem.mem << std::endl;

}

//~ A Error #0
//~ b1: 2
//~ b2: 0

如果我在 A 中重新抛出捕获程序,程序将再次中止...

B 的构造函数没有得到异常,因为 A 的构造函数正在捕获它。去掉那里的 try 块:

A(int i)
:mem(0)
{
    if(i > 9) {
        std::cout << "mem max size 9\n";
        throw 0;
    }
    mem = i;
}

如果您尝试在 B 的初始化程序列表中捕获异常,它无论如何都会被重新抛出,因此不要在那里捕获异常,而是在 main 中捕获它:

int main()
{
    try {
        B b1(2);
        std::cout << "b1: " << b1.mem.mem << std::endl;
    } catch (int e) {
        std::cout << "failed to create b1" << std::endl;
    }
    try {
        B b2(10);
    } catch (int e) {
        std::cout << "failed to create b2" << std::endl;
    }
}