__libc_init_array 和 cpp 中全局声明的对象

问题描述 投票:0回答:1

我有一个微控制器 C++ 项目,我在其中全局声明尽可能多的内容,而不是新建对象。事实上,我没有在任何地方使用

new
关键字。

我现在遇到了

__libc_init_array
的顺序给我带来问题的情况。我希望我能很好地解释我的情况,以便有人指出我是否做错了什么,或者我是否可以控制手头的问题。

我有很多类,其中的依赖项是通过构造函数注入的。这些对象是在启动代码调用

__libc_init_array
时构造的。我现在遇到一种情况,在调用类
B
的构造函数之前调用类
A
的构造函数,而
B
依赖于
A
。因此,当
B
的构造函数使用“未初始化”
A
的任何成员时,应用程序会出现硬故障。

有没有办法强制

__libc_init_array
调用的构造函数的顺序?或者我是否因为这种行为犯了一个可怕的错误?或者...在 C++ 中一起使用构造函数中的依赖项成员是一个坏主意吗?

我意识到当我对所有对象进行

new
时,我可以100%控制这种行为构造顺序,但重构它需要相当多的工作。

现在,我为依赖顺序有问题的单一情况添加了一个

initialize
函数,它解决了问题,但感觉也不是合适的解决方案。

我尝试用谷歌搜索更好的解决方案,但不断提出不相关的问题。

c++ dependency-injection libc
1个回答
0
投票

我遇到了类似的问题,并意识到这是静态初始化顺序失败。如果您将这些类放在单独的翻译单元中,您无法阻止它

我通过声明在主函数中具有依赖项的所有全局类并在各自的头文件中将它们声明为

extern
来解决这个问题。

// a.hpp
class A { /*...*/ }

extern A a;
// b.hpp
class B { /*...*/ }

extern B b;
// main.cpp

A a(/*...*/);  // guarantees that constructor of a is called before
B b(/*...*/);  // constructor of b
© www.soinside.com 2019 - 2024. All rights reserved.