C++
我希望一个类在其构造函数主体的左大括号 {
之前抛出
异常,方法是使用其自己的成员函数来阻止构造。我定义了一个成员函数,其目的只是无条件地抛出
异常,具有任意选择的非void
返回类型和一个类型与该返回类型匹配的虚拟数据成员,这样我就可以通过调用构造函数初始化列表中的所述成员函数构造此数据成员来触发 throw
。这行得通但并不优雅,因为在非玩具类中,虚拟变量除了为成员函数运行提供借口外别无他用,并且成员函数的非 void
返回type 没有其他目的,只是有一个借口让它可以被相同类型的虚拟数据成员的构造函数调用。
这个玩具可以编译但不够优雅:
class Toy
{
public:
Toy() : dummy(preventer()) {}
private:
int dummy;
int preventer() {throw -1; return 0;}
};
#include <iostream>
int main()
{
try
{
Toy t;
}
catch (const int& e)
{
std::cout << "caught the exception\n";
}
return 0;
}
控制台输出:
caught the exception
如果没有虚拟变量,有没有办法在构造函数主体的左花括号 {
之前抛出异常?
最佳答案
是的,您可以使用基类而不是数据成员,然后调用基类的构造函数。
请注意,旧版本的 GNU 调试器 gdb
(几年前)无法中断此类异常。
但是,可以与 Visual C++ 一起使用,而且我相信也可以与现代版本的 GNU 工具链一起使用。
关于c++ - 通过在构造函数主体之前抛出异常来防止构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673132/