アイデアは、プログラミングプロセスでは、我々、デザインパターンに多かれ少なかれ露出、再利用可能なデザインパターンである、しかし、時には、私たちは、私たち今日はシングルトンパターンを説明するために、交差何も満たされない、とCの装着されていない++プログラミングのスキル。
私たちは、実際の開発プロセスでSingletonパターンは、我々が知っている可能性が非常に便利な機能のシングルトンである知っています:
1クラスの唯一のインスタンス
グローバルアクセスポイントを提供するために、2、
3、コピーしないでください
さんが一つ一つを分析してみましょう:
1つのインスタンスのみを達成する必要がある場合は1、私たちは何をする必要があります。
、コンストラクタはプライベート宣言されています
グローバルアクセスポイントを提供するために、2、
、クラスの静的メンバ関数を作成します
3、コピーしないでください
、プライベートコピーコンストラクタを宣言し、実装を提供していません
B、代入演算子は、プライベートと宣言しました
どのように我々は、シングルトンクラスにそれを書いている時点でテスト?二つの方法:
一度だけ呼び出された場合の手順は、インスタンスを1つだけ作成するには、コンストラクタを見るために数回呼ばれる1、インスタンス化複数のオブジェクト、
図2に示すように、シングルステップの追跡、オブジェクトのアドレスを表示し、ターゲットと比較して、同じことを行いました
私は------------- ------------分割ラインでした
C ++を学習するプロセスでは、我々は長い間、コンストラクタとデストラクタにさらされてきた、この2つの機能は、我々は、システムが私たちのために生成され、コンストラクタとデストラクタを宣言しない場合でも、自動的に呼び出されます。
そして、私たちはクラスで、クラス宣言の外にネストされたクラスを持っているのであれば、限り、オブジェクトが作成されると、システムはデストラクタを呼び出しますどんなに、と言うことです決定論的破壊をプログラミングC ++があり、ネストされたクラスオブジェクトは、そのオブジェクトのネストされたクラスのデストラクタは、我々はそれの中にネストクラスのデストラクタで何かを行うことができ、特定の通話のですか?
我々のアプローチは以下のとおりです。
シングルトンシングルトンに埋め込まれたプライベートクラスのガルボのように定義された他の場所で、このような悪用を防ぎます。
実行が終了する唯一のインスタンスは、システムは***静的メンバーガルボシングルトンのデストラクタ、シングルトンのデストラクタを呼び出します。
この方法を解放シングルトンオブジェクト機能を使用します:
1、シングルトン内にネストクラス固有の定義。
図2に示すように、単一の実施形態において、プライベート静的クラスメンバーを解除するため、具体的に定義されました。
図3に示すように、グローバル変数の特性デストラクタの終了時にプログラムを使用して、最終的なリリースタイミングを選びます。
図4に示すように、任意の単一の操作を必要としないコードを使用する例では、関心の対象を放出しません。
コードは以下の通りであります:
私は------------- ------------分割ラインでした
含める
名前空間stdを使用。
ときに人生の終わりには、//静的ガルボgarbo_オブジェクト、ネストされたクラスはデストラクタを呼び出しガルボ
//機能だけでなく、instance_の破壊
//オブジェクト決定的デストラクタの原則を使用します
//制約、インスタンスを1つだけ課す、単にコンストラクタはプライベート宣言しました
//は、アクセスのグローバルなポイントが必要
クラスシングルトン
{
公衆:
静的シングルトン*でGetInstance()
{
もし(NULL == instance_)
{
instance_ =新しいシングルトン。
}
instance_返します。
}
〜シングルトン()
{
裁判所未満 "「〜シングルトン...」"てendl;
}
/ *この方法はまた、リソースを解放することができ、それが最も簡単な方法です
静的な無効無料()
{
もし(NULL!= instance_)
{
instance_削除します。
}
}
* /
//ネストされたクラス
クラスガルボ
{
公衆:
〜ガルボ()
{
(シングルトン:: instance_!= NULL)の場合
{
instance_削除します。
}
}
}。
民間:
//コピーコンストラクタがprivateとして宣言し、あなたはコピーを無効にすることができ、およびインプリメンテーションを提供していません
シングルトン(CONSTシングルトンやその他);
//また、譲渡を禁止し、代入演算子は、プライベートと宣言しました
シングルトン&演算子=(CONSTシングルトンやその他);
シングルトン()
{
裁判所未満 "「シングルトン...」"てendl;
}
//単に述べ、そのクラスの定義の必要性を配置する場合には外
静的シングルトン* instance_。
//作成ガルボオブジェクトが宣言されています
静的ガルボはgarbo_。
//オブジェクト決定的デストラクタの原則を使用します
}。
//ガルボは、ネストされたクラスなので、フロントには、シングルトンを追加しているので
シングルトン::ガルボシングルトン:: garbo_; //静的の前では必要とされていません
シングルトン*シングルトン:: instance_。
メインint型(無効)
{
//ありませんどんなに何回したgetInstance呼び出し、戻り値は同じインスタンスであります
シングルトン* S =シングルトン::でGetInstance();
シングルトン* S1 =シングルトン::でGetInstance();
//シングルトンS3(* S);エラーコピーは禁止
//シングルトンS3 = * S;エラー割当て禁止
//複数のインスタンスを構築し、コンストラクタは一度だけ呼ばれる、いくつかのコンストラクタを呼び出し
//シングルトン::無料();リソースの解放、これは愚かな方法であり、
0を返します。
}
私は------------- ------------分割ラインでした
PS:
図1に示すように、上記方法は、スレッドセーフではありません
2、また、我々は再び終盤に、auto_ptrはスマートポインタを達成するために使用することができます
また、最も簡単な方法は、私たちの鉱業を与え、ネストされたクラスに加えて3、