C++における一例テンプレートクラス

2119 ワード

存在する問題
プログラムを書くときは、単例モードをよく使う必要があります.単一の例を書くと、私たちはよくこのようにします.
class A {
public:
A* Instance();
void DelInst();
private:
static A* pInst;
A();
~A();
A(A& obj);
A& operator=(A& obj);
}
クラスごとに重複したものを書き、DRY(Don't repeat yourself)の原則に違反しています.
ターゲット:
目標は重複を減らすことですが、どうやって重複を減らすのでしょうか.
知覚量:
まず、単一のモードクラスの2つの要素を見てみましょう.
要素1:コンストラクション関数、コピーコンストラクション関数、付与演算子の再ロード、コンストラクション関数はプライベートとして宣言する必要があります.
要素2:次に、取得インスタンスを提供し、インスタンスのInstance()、DelInst()インタフェースを破棄する必要があります.および単一例を保存するポインタ
C++で再利用する方法はどれらがありますか?
関数、継承、テンプレート、マクロ(他に何かありますか?)
こうそくじょうけん
要素1では,1つのクラスのコンストラクション関数などは,親から継承的に取得できないことを自分で宣言しなければならない.では、どうすればいいのでしょうか.マクロを定義することで、重複する宣言を減らすことができます.
要素2では,のInstance()インタフェースを親で継承して得ることができる.これらのインタフェースは異なるタイプに適応するため、親はテンプレートクラスである必要があります.
解決策
単一のテンプレートクラスを使用してマクロ定義を追加する方法を考慮できます.
#pragma once

//     
template
class SinInstTmp{
public:
	static T* Inst() {
		if (pInst == NULL) {
			try {
				pInst = new T();
			} catch(...) {
				pInst = NULL;
			}
		}
		return pInst;
	}


	static void DelInst() {
		if (pInst) {
			delete pInst;
			pInst = NULL;
		}
	}


private:
	static T* pInst;
};
template
T* SinInstTmp::pInst = NULL;

//   
//the concrete class must declare construction and destruction fun to be private
//must have parameter-free construction
#define DeclareSingleton(ClassName)	\
	friend SinInstTmp;		\
private:			\
ClassName();		\
~ClassName();		\
ClassName(ClassName& obj);	\
ClassName& operator=(ClassName& obj);	

したがって、すべてのインスタンスクラスは、次のように宣言できます.
class SubType : public SinInstTmp{
public:
    	void Interface1();
    	void Interface2();
    	DeclareSingleton(SubType)
}

ご利用の際はこのようにすれば大丈夫です
SubType::Inst()->Interface1();
SubType::Inst()->Interface2();