【问题标题】:The default constructor in an child of std::runtime_errorstd::runtime_error 子级中的默认构造函数
【发布时间】:2021-01-01 19:24:36
【问题描述】:

我有两个继承自 std::runtime_error 的异常类。第一个 AError 运行良好。

class AError : public std::runtime_error {
public:
    const char* what() const noexcept
    {
        return "Error of type A!";
    }
};

第二个BError 无法编译,因为std::runtime_error 没有默认构造函数。

class BError : public std::runtime_error {
public:
    const int num_;

    BError(int n) : num_(n) {}; // ERROR: no default constructor for runtime_error

    const char* what() const noexcept
    {
        return "Error of type B!";
    }
};

在我看来AError 不应该编译,因为AError 的默认构造函数应该在默认构造函数AError 中调用std::runtime_error 的默认构造函数。允许该示例编译的 AError 的默认构造函数中发生了什么?

【问题讨论】:

  • 您尚未发布任何构造AError 类型对象的代码。请发布可用于测试您的问题的代码。
  • 我犯了一个严重的错误。这篇文章应该被关闭。
  • @mana 然后,简单地删除它。

标签: c++ oop inheritance default-constructor


【解决方案1】:

在我看来,AError 不应该编译,因为 AError 的默认构造函数应该在默认构造函数 AError 中调用 std::runtime_error 的默认构造函数。

AError 的默认 ctor 被删除,因为它继承自一个没有默认 ctor 的类。尝试以下,代码将无法编译

AError er;

【讨论】:

    【解决方案2】:

    AError 的定义可以编译,因为它没有默认构造函数(不接受任何参数的构造函数)。默认构造函数的隐式生成被禁止,因为std::runtime_error 没有。类定义本身没有可诊断的错误,因为它不创建类的任何实例。

    尝试使用默认构造函数创建AError 的实例时会出现可诊断的错误

    AError an_error;    // error since AError cannot be default constructed
    

    BError中,构造函数的定义(在BError类内)

    BError(int n) : num_(n) {}; // ERROR: no default constructor for runtime_error
    

    尝试隐式构造基础std::runtime_error,即使它没有在初始化列表中列出。所以这个定义在功能上等价于

    BError(int n) : std::runtime_error(), num_(n) {};
    

    并且是一个可诊断的错误,因为尝试使用 std::runtime_error 的(不存在的)默认构造函数(编译器清晰可见)。

    您可以通过简单地使用来自std::runtime_error 的适当构造函数来进行编译,例如

    BError(int n) : std::runtime_error(""), num_(n) {};
    

    它将调用接受const char *std::runtime_error的构造函数。

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2015-03-16
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多