2011-03-05
テンプレート版シングルトンクラス
今回はシングルトンの話です。
シングルトンと言えば、デザインパターンの中でも最も有名と言ってもいいぐらいのパターンですね。
http://ja.wikipedia.org/wiki/Singleton_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
で、ほかの人や自分コードを見たらシングルトンを適用するクラスに毎回シングルトンのコードをコピペしてるんですね。
コピペするのも冗長でめんどくさいな〜と思ったので、勉強も兼ねてテンプレート版のシングルトンクラスを作成してみました。
また何かおかしな所があればコメントお願いします。
テンプレート版シングルトンクラス
多分こんな感じになるかと・・・。
template <class T> class Singleton { public: static T& getInstance(){ static T _Instance; return _Instance; } protected: Singleton(){}; virtual ~Singleton(){}; private: Singleton(const T& obj); Singleton& operator=(const Singleton& obj); };
通常のシングルトンクラスの場合はコンストラクタやデストラクタをprivate指定しますが、今回はprotectedに指定しています。
こうしなければ、このクラスを継承した際にコンストラクタやデストラクタが継承先から呼び出せなくなってしまうからです。
その他は特に変わった所はありません。
続いてこのクラスを継承してみましょう。
class TestManager : public Singleton<TestManager> { friend Singleton<TestManager>; public: void draw(){ printf("%d:%x\n", count, this); } void addCount(){ count++; } private: TestManager() : count(0){ } int count; };
上から順に説明します。
まず継承する時に"Singleton<TestManager>"としています。
これでTがSingleton型に置き換わります。
次に"Singleton<TestManager>"をフレンド指定しています。
Singleton<TestManager>::getInstance()でTestManagerのインスタンスを生成する時に、コンストラクタが呼べなかった為friend指定にしました。
描画関数では現在のカウンタの値と、アドレスと表示するようにしてあります。
使ってみる
これを使うとこんな感じになります。
void main(void) { TestManager& manager1 = TestManager::getInstance(); TestManager& manager2 = TestManager::getInstance(); manager1.draw(); manager1.addCount(); manager2.draw(); manager2.addCount(); manager1.draw(); return; }
実行結果
0:3791b0
1:3791b0
2:3791b0
アドレスが同じで、カウンタの値も正しいですね。
こんな感じで、冗長なコードはなるべく書かないようにしたいですね。
時間も惜しいですし・・・。
「このほうがいいのでは?」とかありましたら、どしどしコメントください。
- 82 http://www.google.co.jp/url?sa=t&rct=j&q=ゲーム クラス設計&source=web&cd=7&ved=0CFYQFjAG&url=http://d.hatena.ne.jp/buti2112/20110116/1295204734&ei=AlOhTo-GG-zTmAWc1sShCQ&usg=AFQjC
- 67 http://twitter.com/
- 36 http://cpp.ring.hatena.ne.jp/
- 34 http://www.google.co.jp/url?sa=t&rct=j&q=インベーダーゲーム クラス図&source=web&cd=5&ved=0CDoQFjAE&url=http://d.hatena.ne.jp/buti2112/20110206/1
- 24 http://search.yahoo.co.jp/search?p=インベーダー 戦車 ゲーム&sp=1&aq=-1&ei=UTF-8&fr=top_ga1_sa&SpellState=
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=シングルトン c++ ゲーム&source=web&cd=1&ved=0CB4QFjAA&url=http://d.hatena.ne.jp/buti2112/20110305/1299354753&ei=h2W-Tpn
- 16 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4DBJP_jaJP293JP293&q=ゲームプログラミング クラス設計
- 14 http://search.yahoo.co.jp/search?p=クラス設計+ゲーム&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&x=wrt
- 14 http://www.google.co.jp/search?q=インベーダーゲーム タスクシステム&hl=ja&prmd=ivns&ei=GraeTeCaJIzKceLg-YIC&start=10&sa=N
- 13 http://search.yahoo.co.jp/search?p=C+++インベーダーゲーム+ソース&aq=-1&ei=UTF-8&pstart=1&fr=top_ga1_sa&b=21