A の cstr で B::SYMBOL がまだ初期化されていないため、以下のコードではセグメンテーション違反が発生することを理解しています。しかし、なぜ?
実際には、A は、B のようなクラスの SYMBOL をそれぞれの 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)
{
}