我有以下问题:
如果在其某个成员的构造函数中抛出异常,我想删除一个母对象。 我该怎么做?
以下不是我想要的。只是你有什么可以参考......
#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中的程序,程序会再次中止......
答案 0 :(得分:3)
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;
}
}