2008-09-13 8 views
-3

私はすぐにmy blogに記事を投稿しますが、最初に何かを見逃していないことを確認したいと思います。C++クイズ - シングルトン

私が見逃した例を見つけると、私はあなたの投稿にあなたを引用します。

トピックが失敗しましたシングルトン実装:偶発的にシングルトンの複数のインスタンスを取得できますか?

これまでのところ、私が作ってみた:シングルトンの

  • 競合状態
  • 複数のDLLまたはDLLへの instance()
  • 定款への最初の呼び出しにし、実行可能なテンプレートの定義 - 実際には別々のクラス

他の方法がありますか?おそらく継承ですか?

+0

私はポストでこのポストの情報を使いたいので、完全な開示であると感じました。申し訳ありませんが、面白いことをやっているように感じましたが、面白い質問が残っています。 – theschmitzer

+0

投稿がアップしています。ありがとう。 – theschmitzer

答えて

3

cppファイルで初期化する静的インスタンスフィールドを使用すると、スタティック/グローバルの初期化がシングルトンのインスタンスを取得しようとすると、複数のインスタンス(さらに悪い動作)が発生する可能性があります。これは、コンパイル単位での静的初期化の順序が定義されていないためです。

+0

あなたが言っていることは、_instanceによって使用されるグローバルメモリがNULLに初期化されていることです。もう1つのグローバル変数はインスタンス#1を割り当ててから、明示的な_instanceイニシャライザを実行し、NULLに戻します。 ()は2回目の時間を割り当てますか? – theschmitzer

+0

それでは、グローバルデータメンバの初期化の前にグローバルメモリがどのように見えるのでしょうか... – theschmitzer

+0

ポイントは、グローバルメモリがメインの前にNULLに初期化されていますが、シングルトンインスタンスを要求する前である必要はありません。 –

1

継承は、ctorがプライベートである限り、問題ではありません。

ただし、コピーコンストラクタを許可しない場合、ユーザは意図的にシングルトンインスタンスをコピーすることがあります。これを防ぐには、boost::noncopyableから個人的に継承するのが最も簡単な方法です。

+0

継承を使用する代わりに、面倒な2つのメソッドをプライベートとして宣言するほうがはるかに優れています。あなたがそれを持ち込みたくない場合は、ブーストの包含を保存し、継承を使用します(両方ともマイナーコストですが、知っておきます) – hazzen

+0

これは有効なオプションであり、私が以前に行ったことです。代替回答として投稿してみませんか? BTW、より良い主観的です... boost :: noncopyableメソッドは、特定の行番号のコンパイラエラーを生成します。あなたの方法はリンク時間エラーをもたらします。これは、初心者が追跡するのが難しくなる可能性があります。 –