シングルトンクラス
説明する
これは、システムのライフサイクル全体において、クラスは最大でも 1 つのインスタンスのみを持つことができ、インスタンスを一意にすることを意味します (インスタンスはオブジェクト ポインターを参照します)。たとえば、オンラインの人数を数える
シングルトンクラスではLazyスタイルとHungryスタイルに分かれており、両者の違いはインスタンス作成時の時間にあります。
- 遅延スタイル: コードの実行後はインスタンスが存在せず、必要な場合にのみインスタンスが作成されることを意味します (シングル スレッドに適用)
- ハングリー スタイル: コードが実行されるとすぐにインスタンスがすでに存在することを意味し、必要なときに直接呼び出すだけです (マルチスレッドに適用可能)
使用法
- コンストラクターのアクセス属性をプライベートに設定し、
- ユーザーに単一のインスタンスへのアクセスのみを提供できる GetInstance() 静的メンバー関数を提供します。
- ユーザーが取得できる静的メンバー ポインターを定義します。
- オブジェクト間でのコピーを避けるために、代入演算子 (=) とコピー コンストラクターをオーバーロードし、それらをプライベートに設定します。
シングルトン クラスの予備的な調査 - 遅延スタイル:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
ランニングプリント:
0x6e2d18
0x6e2d18
0x6e2d18
出力結果から、ポインター オブジェクトがすべて同じアドレスを指していることがわかります。これは、クラスが持つことができるインスタンスは最大 1 つだけであることを意味します。
注: インスタンスはシステムのライフサイクル中に存在するため、システムがまだ実行されている限り削除する必要はありません。
上記の遅延スタイルでは、マルチスレッド状況で複数の Csingleton ポインター オブジェクトが getInstance() メンバー関数を同時に呼び出すと、m_pInstance = NULL であるため、複数のインスタンスが作成されます。
そのため、マルチスレッドの場合はHungry Manを利用して実装する必要があります。
コードは以下のように表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
シングルトンクラステンプレート
今説明しているのは単なるフレームワークです 中身が無いとニーズに応えられないので シングルトンクラスのテンプレートヘッダファイルとして記述する必要があります シングルトンクラスが必要な場合はシングルトンクラスのテンプレートを宣言するだけですヘッダファイルを直接。
write-CSingleton.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
このシングルトン クラス テンプレートが必要な場合は、自分のクラスの friends を介してそれをフレンドとして追加するだけです。
次にシングルトン クラス テンプレートを試してください
main.cppを書きます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
mstr = abc
this = 0x2d2e30mstr = abc
this = 0x2d2e30mstr = ABCDEFG
this = 0x2d2e30
以上、エディターが紹介したC++シングルトンクラステンプレートの詳細な説明と統合についてでしたので、ご参考になれば幸いです。