0

C++

我希望一个类throw在其构造函数的主体的左大括号之前出现异常,{方法是使用它自己的成员函数来防止构造。我定义了一个成员函数,其目的只是无条件地throw异常,具有任意选择的非void返回类型和一个类型与该返回类型匹配的虚拟数据成员,以便我可以throw通过调用构造这个数据成员来触发构造函数初始化列表中的成员函数。这可行,但并不优雅,因为在非玩具类中,虚拟变量没有其他用途,只能为成员函数运行提供借口,并且成员函数的非void返回类型没有其他用途,只是有一个借口可以由相同类型的虚拟数据成员的构造函数调用。

这个玩具可以编译但并不优雅:

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

{如果没有虚拟变量,有没有办法在构造函数主体的左大括号之前抛出异常?

4

2 回答 2

2

是的,您可以使用基类而不是数据成员,然后调用基类的构造函数。

请注意,旧版本的 GNU 调试器gdb(几年前)无法解决此类异常。

但是,它适用于 Visual C++,我相信也适用于现代版本的 GNU 工具链。

于 2013-03-28T02:30:19.617 回答
1

您可以像这样避免函数的虚拟返回值:

bool called = (function(), true);

右边两个表达式之间的逗号运算符依次计算表达式,丢弃除最后一个结果之外的所有结果。我想知道的是为什么你坚持在打开花括号之前这样做。您到底想在这里实现什么,而通过调用函数作为主体中的第一件事是无法实现的?

请注意,如果您想尽早中止,那么在单独的基类中执行此操作(您可以在那里使用私有继承)可能是最好的解决方案。这是唯一允许您阻止构建其他基础的解决方案,而您的解决方案却没有。

于 2013-03-28T05:46:59.427 回答