これは古いテーマの別のバリエーションです。異なる翻訳単位での静的オブジェクトの初期化順序は定義されていません。
以下は、私の特定のシナリオの簡略化された例です。クラス G と F は非 POD タイプです。F が G に依存するということは、F のインスタンスを構築するには G のいくつかのインスタンスが必要であるという意味です (たとえば、F はアプリケーションが発行する何らかのメッセージであり、G のインスタンスはそのようなメッセージのコンポーネントである可能性があります)。
G.hpp
#ifndef G_HPP
#define G_HPP
struct G
{
G() {} // ...
};
inline G operator+(G, G) { return G(); }
#endif
Gs.hpp
#ifndef GS_HPP
#define GS_HPP
#include "G.hpp"
extern const G g1;
extern const G g2;
extern const G g3;
extern const G g4;
extern const G g5;
extern const G g6;
extern const G g7;
extern const G g8;
extern const G g9;
#endif
Gs.cpp
#include "Gs.hpp"
const G g1;
const G g2;
const G g3;
const G g4;
const G g5;
const G g6;
const G g7;
const G g8;
const G g9;
F.hpp
#ifndef F_HPP
#define F_HPP
#include "G.hpp"
struct F
{
F(G) {} // ...
};
#endif
Fs.hpp
#ifndef FS_HPP
#define FS_HPP
#include "F.hpp"
extern const F f1;
extern const F f2;
extern const F f3;
#endif
Fs.cpp
#include "Fs.hpp"
#include "Gs.hpp"
const F f1(g1 + g2 + g3);
const F f2(g4 + g5 + g6);
const F f3(g7 + g8 + g9);
operator+
F のコンストラクターは、 G のインスタンスに適用した結果である引数を取り
ます。F と G の両方のインスタンスはグローバル変数であるため、F のコンストラクターが必要とするときに G のインスタンスが初期化されているという保証はありません。
ここでの特殊性は、あちこちに多くの G と F があることです。F が必要なときはいつでも G の構築を強制しながら、構文を上記のコードに可能な限り近づけたいと思います。