首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绕过基类构造函数调用

绕过基类构造函数调用
EN

Stack Overflow用户
提问于 2014-11-07 17:49:28
回答 3查看 394关注 0票数 2

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

代码语言:javascript
运行
复制
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()。例如:

代码语言:javascript
运行
复制
class global_A : public A {
 public:
  global_A() {}
}

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

这些类有相当多的方法,我不希望我的代码变大。这么说,除了将A完全复制到global_A sans构造函数之外,还有更好的方法来解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-07 18:27:59

听起来A应该继承global_A,而不是相反。

不过,您可能需要想出一个比global_A更好的名称。

票数 2
EN

Stack Overflow用户

发布于 2014-11-07 17:59:16

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

代码语言:javascript
运行
复制
global_A::global_A(): A(some_arguments) {}

另一种方法可以是使用返回引用的函数本地对象,并在初始化库后的适当时间调用该函数:

代码语言:javascript
运行
复制
global_A& global() {
    static global_A rc;
    return rc;
}

除此之外,并不是说您可能最好的做法是**不具有任何全局对象!通常,任何全局状态都会使代码难以测试,并在涉及并发性时造成问题。

票数 3
EN

Stack Overflow用户

发布于 2014-11-07 18:20:32

在基类上创建一个不调用init()的非默认构造函数。在全局类构造函数的初始化列表中显式调用此非默认构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26807064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档