为了账号安全,请及时绑定邮箱和手机立即绑定

C ++静态初始化顺序

C ++静态初始化顺序

C++
繁星coding 2019-07-30 16:55:16
C ++静态初始化顺序当我在C ++中使用静态变量时,我常常想要初始化一个变量,将另一个变量传递给它的构造函数。换句话说,我想创建彼此依赖的静态实例。在单个.cpp或.h文件中,这不是问题:将按照声明的顺序创建实例。但是,如果要使用另一个编译单元中的实例初始化静态实例,则无法指定顺序。结果是,根据天气,可能会发生构建依赖于另一个实例的实例,并且之后才构建另一个实例。结果是第一个实例初始化不正确。有谁知道如何确保以正确的顺序创建静态对象?我已经搜索了很长时间寻找解决方案,尝试了所有这些解决方案(包括Schwarz Counter解决方案),但我开始怀疑有一个确实有效。一种可能性是使用静态函数成员的技巧:Type& globalObject(){     static Type theOneAndOnlyInstance;     return theOneAndOnlyInstance;}实际上,这确实有效。遗憾的是,您必须编写globalObject()。MemberFunction()而不是globalObject.MemberFunction(),从而导致一些令人困惑和不雅的客户端代码。更新:感谢您的反应。遗憾的是,我确实似乎回答了自己的问题。我想我必须学会忍受它......
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

也许您应该重新考虑是否需要这么多全局静态变量。虽然它们有时可能很有用,但通常将它们重构到较小的局部范围要简单得多,尤其是当您发现某些静态变量依赖于其他变量时。

但是你是对的,没有办法确保特定的初始化顺序,所以如果你的心被设置在它上面,那么像你提到的那样在函数中保持初始化可能是最简单的方法。


查看完整回答
反对 回复 2019-07-30
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

实际上,这确实有效。遗憾的是,您必须编写globalObject()。MemberFunction()而不是globalObject.MemberFunction(),从而导致一些令人困惑和不雅的客户端代码。

但最重要的是它有效,而且它是失败证明,即。绕过正确的用法并不容易。

程序正确性应该是您的首要任务。另外,恕我直言,上面的()是纯粹的风格 - 即。完全不重要。

根据您的平台,请注意过多的动态初始化。动态初始化器可以进行相对少量的清理(参见此处)。您可以使用包含不同全局对象成员的全局对象容器来解决此问题。你因此:

Globals & getGlobals (){
  static Globals cache;
  return cache;}

只有一次调用~Globals()来清理程序中的所有全局对象。要访问全局,您仍然可以使用以下内容:

getGlobals().configuration.memberFunction ();

如果你真的想要你可以将它包装在宏中以使用宏保存一点点输入:

#define GLOBAL(X) getGlobals().#X
GLOBAL(object).memberFunction ();

虽然,这只是初始解决方案的语法糖。


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信