c++ - 绕过基类构造函数调用

标签 c++ inheritance

我正在编写一些使用其他库中的类型和函数的类。该库需要在调用任何其他函数之前进行初始化。此外,这些类使用库提供的数据类型,这些数据类型也必须在使用前进行初始化(但在库初始化之后)。这些类如下所示:

class A {
 public:
  A() { init(); }
  void init() { lib_type_init(&t); }
  // ...
  // Other methods
  // ...
 protected:
  lib_type t;
  // ...
  // Other fields
  // ...
}

我不想在 A 的实例上显式调用 init(),因为我有很多 A 的实例> 在我的应用程序中,所以我在构造函数中调用了 init()。但是,当我想在全局范围内定义 A 的实例时,这会出现问题。所以我认为继承是正确的答案,只需提供一个不调用 init() 的构造函数,并要求应用程序在全局使用之前显式调用 init()实例。例如:

class global_A : public A {
 public:
  global_A() {}
}

但是,这仍然是一个问题,因为在 C++ 中,如果构造函数没有参数,派生类会调用基类构造函数。当调用对象的全局构造函数时,这显然会在运行时引起问题(它会尝试调用库 init 函数并产生错误,因为库本身未初始化)。

这些类有相对较多的方法,我不希望我的代码体积膨胀。话虽这么说,除了将 A 完全复制到 global_A 之外,还有没有更好的方法来解决这个问题?

最佳答案

似乎默认构造函数总是自动调用 init()。只有当有其他构造函数不调用 init() 时,拥有公共(public) init() 函数才有意义。您应该只从派生类的成员初始化列表中调用相应的构造函数:

global_A::global_A(): A(some_arguments) {}

另一种方法是使用函数局部对象,返回引用并在库初始化后的适当时间调用此函数:

global_A& global() {
    static global_A rc;
    return rc;
}

除此之外,并不是说您可能最好不要*首先拥有任何全局对象!通常,任何全局状态都会使代码难以测试,并在涉及并发时导致问题。

关于c++ - 绕过基类构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807064/

相关文章:

c++ - 派生运算符 < 接收 Base 对象作为参数

python - 当子类用 __init__() 调用 super() 时,父类(super class)的对象在哪里/什么?

c++ - 指令#pragma,为什么这样调用它?

c++ - 当我将类作为模板时,为什么会编译?

c++ - 如何将 constexpr 函数的参数标记为未使用?

c++ - 什么可以防止类中相邻成员重叠?

c++ - 移动物理引擎

C++使用上面类二类的功能

没有 'new' 关键字的 JavaScript 继承

c# - 如何声明一个继承自另一个抽象类的抽象泛型类?