init()
アプリケーションの起動時に呼び出す必要がある静的メソッドがたくさんあります。やらなければならないようなもの:
A::init();
S::init();
//...
これを行う 1 つの方法は、次のように静的変数を初期化することです。
static bool const b{A::init(), S::init(), false};
より良い代替手段はありますか?
コンストラクターでさまざまなコンポーネントを初期化し、デストラクターでそれらを終了するスタートアップ クラスのインスタンスを使用できます。例:
struct Startup
{
Startup()
{
A::Init();
B::Init();
}
~Startup()
{
B::Term();
A::Term();
}
};
namespace { Startup startup; }
int main()
{
// do stuff being completely oblivious to the startup
}
「ライフ・ビフォア・メイン」で何度も遊んできましたが、通常は必要以上に苦痛であることに気づきました。
したがって、私のアドバイス:
int main() {
A::init();
S::init();
// ...
}
わかりやすくするために、init
それらすべてを順番に呼び出す関数を作成する価値があるかもしれません。
また、さまざまなライブラリ間の依存関係ツリーが明確でない限り、パッケージ化 (つまり、call を使用) しないことをお勧めします。ひし形の依存関係の場合、ベース ライブラリが複数回呼び出されることになる可能性があるためです。B::init
A::init
init
自動初期化しないでください。内の起動時にサブシステムを明示的に初期化しますmain
。
理由は次のとおりです。
main
個人的には、シンプルに保つことを絶対にお勧めします。魔法のスタティックではなく、内で初期化します。そうすれば、それが起こることが明確になり、いつ起こるかが明確になります。また、アプリケーションが発生する前後の状態について推論することができます。
前後に起こることはすべて、後でmain
トラブルにつながる傾向があります。