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