オブジェ工場

普通、オブジェクトとかはnew演算子で作ります。

class Object
{
	//あんなものやこんなものがあったりする。
};

Object* p = new Object;

しかし、いろいろあって外で作らないで専用の工場を設けてそいつに作らせるということもよくあります。

Object* p = pFactory->make< Object >();

こいつの利点として、作る際にいろいろ中で登録したりして工場内で今後も管理できたりします。
そうなると今後は逆に、工場の外で勝手に作られては困ってくる場合があります。もちろん、その場合は外で作らないように気をつけて書けばいいことなのですが、まあ、それでも間違って作っちゃうなんてことは良くあるんですよ。なので、工場でしか作れないようにしたいわけなんですね。で、その方法として、staticメンバ変数を使う方法があります。

class Object
{
public:
	Object()
	{
		if( !g_bInit ){
			//ここで例外を投げるなりする。
		}
	}
	static bool g_bInit;
	
	//その他あんなものやこんなものがあったりする。
};

template< class T >
T* Factory::make< T >( void ){
	T::g_bInit = true;
	T* p = new T;
	T::g_bInit = false;
	//その他、あんなことやこんなことを記録しちゃう。
	return p;
}

これで間違って外で作ってしまった場合は実行時にエラーが帰ってきてわかるわけですね。しかし、逆に言えば実行するまで間違っているかわからないんですね。出来ればコンパイル時にわかりたいわけなんですよ。で、その方法がありました。

class Object
{
private:
	Object(){}
	friend class Factory;
	
	//その他あんなものやこんなものが・・・
	
};

わかりますか?コンストラクタをprivateにするんですね。そして、工場をお友達として認識しておけば、工場内でしか作ることは出来ません。外で作ろうとしたらコンパイル時にエラーが返ってきます。ついでに、ディストラクタもprivateにしておけば、工場内でしか破壊もできなくなります。

というわけで、C++のプチ裏技(?)でした。