C++プログラムでは、一度インスタンス化されるヘルパー定数オブジェクトが必要です。これらのオブジェクトはほとんど同じ翻訳単位内で使用されますので、これを実行する最も簡単な方法は、彼らが静的にするために、次のようになります。静的変数の代わりに使用するもの
static const Helper h(params);
しかし、そこにこのstatic initialization order問題があるので、Helper
は、いくつかの他の静力学(を参照している場合params
経由)、これはUBにつながる可能性があります。
もう一つのポイントは、最終的にはこのオブジェクトを複数のユニット間で共有する必要があるということです。私がただstatic
のままにして、.hファイルに入れると、それは複数のオブジェクトにつながります。私はextern
などで気にすることでそれを避けることができますが、これは最終的に同じ初期化の問題を引き起こす可能性があります(そしてC-ishのようには見えません)。
(例えばMySingleton::GetInstance().MyVar
)私はシングルトンについて考えたが、それは定型的なコードと不便な構文にやり過ぎによるものだろう - これらのオブジェクトはヘルパーですので、彼らはそれらを複雑にしないように、物事を単純化することになっている...
同じC++よくある質問mentionsこのオプション:
Fred& x()
{
static Fred* ans = new Fred();
return *ans;
}
がこれは本当に使用して良いことだと考えていますか?私はそれをこのようにしなければならないのでしょうか、あるいは他の選択肢を提案しますか?ありがとう。
編集:私は実際にそのヘルパーが必要な理由を明確にしておかなければなりません:通常の定数と非常によく似ていますが、あらかじめ計算されている可能性があります。私は自動的にマルチスレッドの問題を解決するので、mainの前にそれらをインスタンス化する方が好きです(C++ 03ではローカル統計は保護されていません)。また、私が言ったように、それらはしばしば翻訳単位に限定されるので、それらをエクスポートしてmain()で初期化するのは意味がありません。それらを単なる定数と考えることはできますが、実行時には分かります。
良いことではないと思われる場合は、FAQには載っていません。だから、そのイディオムを使用したい場合は、先に進んでください。 – Philipp
@Philipp:グローバルな状態は決して良いことではありません... @ 7vies:何とか漏れない限り、ヒープに 'ans'を割り当てる理由はありません。 –
@Philipp:私が見ている限り、それは共同FAQではなく、著者の意見に完全に頼る理由はありません –