2

init()アプリケーションの起動時に呼び出す必要がある静的メソッドがたくさんあります。やらなければならないようなもの:

A::init();
S::init();
//...

これを行う 1 つの方法は、次のように静的変数を初期化することです。

static bool const b{A::init(), S::init(), false};

より良い代替手段はありますか?

4

5 に答える 5

3

コンストラクターでさまざまなコンポーネントを初期化し、デストラクターでそれらを終了するスタートアップ クラスのインスタンスを使用できます。例:

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
}
于 2015-01-02T16:08:28.687 に答える
3

「ライフ・ビフォア・メイン」で何度も遊んできましたが、通常は必要以上に苦痛であることに気づきました。

したがって、私のアドバイス:

int main() {
    A::init();
    S::init();

    // ...
}

わかりやすくするために、initそれらすべてを順番に呼び出す関数を作成する価値があるかもしれません。

また、さまざまなライブラリ間の依存関係ツリーが明確でない限り、パッケージ化 (つまり、call を使用) しないことをお勧めます。ひし形の依存関係の場合、ベース ライブラリが複数回呼び出されることになる可能性があるためです。B::initA::initinit

于 2015-01-02T16:18:55.627 に答える
3

自動初期化しないでください。内の起動時にサブシステムを明示的に初期化しますmain

理由は次のとおりです。

  1. 初期化順序を制御できます
  2. 初期化に失敗した場合は、適切に処理できます
  3. 初期化によってクラッシュが発生した場合、デバッグが容易になり、うまくいけば適切なスタック トレースが得られます。
  4. 初期化プロセスを完全に認識していることを保証します
于 2015-01-02T16:22:05.483 に答える
1

main個人的には、シンプルに保つことを絶対にお勧めします。魔法のスタティックではなく、内で初期化します。そうすれば、それが起こることが明確になり、いつ起こるかが明確になります。また、アプリケーションが発生する前後の状態について推論することができます。

前後に起こることはすべて、後でmainトラブルにつながる傾向があります。

于 2015-01-02T16:24:24.330 に答える