我知道下面的代码会导致分段错误,因为在 A 的 cstr 处,B::SYMBOL 尚未初始化。但为什么?
实际上,A 是一个用作映射的对象,它将像 B 这样的类的符号映射到它们各自的 ID。C 静态地保存这个 map(A),这样它就可以将映射作为类函数提供。
A 的主要功能是作为 C 的映射,在启动时初始化自身。如果我仍然可以在代码中使用 B::ID 和 B::SYMBOL(没有#define pls),我应该如何在没有分段错误的情况下做到这一点?
(ps。假设我已经实现了包含警卫)
//A.h
#include "B.h"
class A
{
public:
A()
{
std::cout<<B::ID<<std::endl;
std::cout<<B::SYMBOL<<std::endl;
}
};
//B.h
class B
{
public:
static const int ID;
static const std::string SYMBOL;
}
//B.cpp
#include "B.h"
const int B::ID = 1;
const std::string B::SYMBOL = "B";
//C.h
#include "A.h"
class C
{
public:
static A s_A;
};
//C.cpp
#include "C.h"
A C::s_A;
//main.cpp
#include "C.h"
int main(int c, char** p)
{
}