我试图在两个不同的.cpp中声明两个静态变量,一个正在初始化期间尝试使用另一个(例如Class B-> Class A)。如果我有包含a.h和b.h的main.cpp,则可以编译代码。它在运行时崩溃(分段故障(核心已转储))。我知道这是静态变量初始化的问题,在静态对象B初始化期间可能尚未初始化静态变量A。
请问通过更改我的编码方式或任何设计模式的使用方式来解决此类问题的正确方法是什么?
我看到一些帖子说要在编译期间使用“ constexpr”强制A :: a初始化,但我陷入语法错误。
static constexpr std::string a; // in a.h
constexpr std::string A::a="AAA"; // in a.cpp
错误:
a.h:7:34: error: constexpr static data member ‘a’ must have an initializer
static constexpr std::string a;
a.cpp:4:26: error: redeclaration ‘A::a’ differs in ‘constexpr’
constexpr std::string A::a="AAA";
完整代码如下: a.h
#include <string>
using namespace std;
class A
{
public:
static const std::string a;
A();
~A();
};
a.cpp
#include "a.h"
using namespace std;
const std::string A::a("AAA");
A::A(){};
A::~A(){};
b.h
#include <string>
using namespace std;
class B
{
public:
B(const std::string& a );
~B();
};
b.cpp
#include "b.h"
#include "a.h"
#include <iostream>
static const B b(A::a);
B::B(const std::string& s){ cout <<"B obj::" << s << endl; };
B::~B(){};
我已经考虑过创建一个全局的getter函数
getA()
{
static std::string A::a; //hope that would force A::a initialization
return A::a;
}
然后
static B b(getA())
看起来很丑...
答案 0 :(得分:3)
您所说的什么叫静态初始化顺序问题。它被认为是“经典”问题。避开它的想法是手动管理变量的初始化顺序。
这是一个经典的常见问题解答条目:https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use。