12

素晴らしいC++ の FAQを読んでいたとき (本当に良かったです!!) 、静的な初期化順序「大失敗」を防ぐ方法についてのトピックを読みました。したがって、著者は、変数の作成順序を維持することで「大失敗」を防ぐために、静的変数を関数にラップすることをお勧めします。しかし、これは失礼な回避策のように思えます。だから私の質問は、この「大失敗」を防ぎ、「静的なもの」を関数にラップする、よりパターン指向の最新の方法はありますか?

4

3 に答える 3

5

だから私の質問は、この「大失敗」を防ぎ、「静的なもの」を関数にラップする、よりパターン指向の最新の方法はありますか?

ほとんどの場合、メイン関数で「グローバル」データを宣言し、必要に応じて依存性注入を使用して渡すことができます。つまり、静的な状態はまったくありません。

実際には、静的データが必要な状況が発生する可能性があります。他のスタティックに依存関係がない場合は、スタティック データを作成しますconst/constexpr

// smart pointer that implements the "Foo" release policy
class FooPointer
{
    static const FooPointer NullFoo; // does not depend on other static values
    /* ... */
};

静的変数互いに依存している場合は、それらを静的関数でラップするだけです。

// smart pointer that implements the "Foo" release policy
class FooPointer
{
    static const FooPointer& NullFoo(); // depends on other static values
    /* ... */
};

要約する:

ほとんど (90%? 99%?) の静的/グローバル/共有データは、使用される場所に依存関係を注入する必要があり、静的としてはまったく作成されません。

何らかの理由で静的が必要であり、それらが他の静的に依存しないまれなケースでは、静的変数を宣言します。

静的を静的にする必要があり、それらが互いに依存している非常にまれなケースでは、それらを静的メソッドで wap します

経験則として、2 番目と 3 番目のケースが多い場合は、最初のケースを十分に行っていません。

于 2015-04-23T11:52:55.550 に答える