我正在编写一些使用来自另一个库的类型和函数的类。此库在调用任何其他函数之前需要初始化。此外,类使用库提供的数据类型,这些数据类型也必须在使用之前(但在初始化库之后)初始化。这些类如下所示:
class A {
public:
A() { init(); }
void init() { lib_type_init(&t); }
// ...
// Other methods
// ...
protected:
lib_type t;
// ...
// Other fields
// ...
}我不想在A实例上显式调用A,因为我的应用程序中有很多A实例,所以我在构造函数中调用了init()。但是,当我想在全局范围内定义一个A实例时,这就出现了一个问题。因此,我认为继承是正确的答案,只需提供一个不调用init()的构造函数,并要求应用程序在全局实例中使用之前显式调用init()。例如:
class global_A : public A {
public:
global_A() {}
}但是,这仍然是一个问题,因为在C++中,如果构造函数没有参数,则由派生类调用基类构造函数。这显然会导致在运行时调用对象的全局构造函数(它试图调用库init函数并产生错误,因为库本身没有初始化)。
这些类有相当多的方法,我不希望我的代码变大。这么说,除了将A完全复制到global_A sans构造函数之外,还有更好的方法来解决这个问题吗?
发布于 2014-11-07 18:27:59
听起来A应该继承global_A,而不是相反。
不过,您可能需要想出一个比global_A更好的名称。
发布于 2014-11-07 17:59:16
默认构造函数似乎总是自动调用init()。只有当有其他不调用init()的构造函数时,才能使用公共init()函数。您应该从派生类的成员初始化程序列表中调用相应的构造函数:
global_A::global_A(): A(some_arguments) {}另一种方法可以是使用返回引用的函数本地对象,并在初始化库后的适当时间调用该函数:
global_A& global() {
static global_A rc;
return rc;
}除此之外,并不是说您可能最好的做法是**不具有任何全局对象!通常,任何全局状态都会使代码难以测试,并在涉及并发性时造成问题。
发布于 2014-11-07 18:20:32
在基类上创建一个不调用init()的非默认构造函数。在全局类构造函数的初始化列表中显式调用此非默认构造函数。
https://stackoverflow.com/questions/26807064
复制相似问题