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