静的フィールド(#B)の初期化の前にグローバル変数の初期化(#A)を呼び出させます。特定の静的フィールドの前にグローバル変数を初期化するようにします
現在、一部の静的フィールドはグローバル変数の前に初期化されています。
GridUtil.h
class GridUtil{
static Vec4* bPtr_; //will be filled
static void initGridCalculationCache();
static class _init //helper class
{
public:
_init() {
static_iniAll();
}
} _initializer;
}
GridUtil.cpp
#include "GridUtil.h"
GridUtil::_init GridUtil::_initializer;// (Edit: This line is just added, thank Dietmar Kühl.)
Vec4 b[24]; //#A executed 3rd : No, this should be the first.
Vec4* GridUtil::bPtr_=b; //#B executed 1st
void GridUtil::initGridCalculationCache() {
//.... fill GridUtil::bPtr_ using complex computation //#C executed 2nd
}
結果
デバッグから、上記コードの実行順序は次のとおり -
B->C->A
しかし、私がしたい: -
A->B->C
私は "Vec4" を "INT" に置き換えられた場合、実行順序がなることに気づい: -
A->B->C
目的自動的に呼び出される静的関数(initGridCalculationCache)を使用して配列の要素の値を設定します(クラス_initによって助けられます)。
できない場合は、それを行う正しい方法は何ですか?
GridUtil.hを組み込む前にGridUtil.cppでグローバル変数を宣言しようとしましたか、それとも静的であると宣言しましたか? – wasthishelpful
グローバル情報については、https://isocpp.org/wiki/faq/ctors#static-init-orderを参照してください。 – N0un
@wasthishelpfulありがとう!それは正解ですが、あなたが望むなら答えとして投稿することができます。 – javaLover