スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Singletonテンプレートを作ったぞ!(`・ω・´)

テンプレートの勉強も進めているので、ちょっと練習がてら
Singletonパターンのテンプレート版を作ってみました。

【参考画像】
Book2.jpg
↑使ってる参考書


//Singleton.h
#pragma once
#define SAFE_DELETE(p) { if (p) { delete (p); (p)=0; } }

template< class T >
class Singleton{
public:
static T& getInstance(void){
static T singleton;
return singleton;
}
protected:
Singleton();
virtual ~Singleton();
private:
Singleton(const Singleton& obj);
Singleton& operator=(const Singleton& obj);
static T* singleton;
};

template< class T >
T* Singleton< T >::singleton = 0;

template< class T >
Singleton< T >::Singleton(){

}

template< class T >
Singleton< T >::~Singleton(){

}


//Test.h

#include"Singleton.h"

class Test : public Singleton< Test >{
friend Singleton< Test >;
public:
void CountUp(void);
void DispCount(void);
private:
Test();
~Test();
int count;
};


//Test.cpp
#include"Test.h"
#include< iostream >

Test::Test():count(0){

}

Test::~Test(){

}

void Test::CountUp(void){
++count;
}

void Test::DispCount(void){
std::cout << count << "です。" << "(アドレス:"<< this << ")" << std::endl;
}


//main.cpp
#include"Test.h"

int main(void){
Test& aa = Test::getInstance();
Test& bb = Test::getInstance();
Test& cc = Test::getInstance();

aa.DispCount(); aa.CountUp();
bb.DispCount(); cc.CountUp();
cc.DispCount();
return(0);
}


実行してみたところ、問題なく動きました。恐らくコレで大丈夫でしょう。

以前から、リソース管理クラスなんかを作るときに、
Singletonパターンの部分を毎回毎回コピペして冗長になってたので、
何かとてもスッキリしました。
テンプレートすごい!


さて、問題は期日までにゲーム作品が完成するかどうかです。
間に合うか、物凄い心配です。

ずっと脳内で、「ゼルダの伝説 ムジュラの仮面」の、
月が落ちてくる直前の音楽が流れてるんですけど。

【参考URL】ゼルダの伝説 ムジュラの仮面 その81
(この音楽は緊迫感が凄まじい。 あとプレイ動画なので、音楽が聞こえにくいかも)

アクションゲームのステージ構成とか考える暇が無いかもしれないので、
ちょっと格闘ゲームに近くなるかもしれない。
(大乱闘スマッシュブラザーズ的な感じ)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コピーコンストラクタをプライベートで多重定義しておいた方がよいのでは?

No title

Singletonクラス側に何故かコピーコンストラクタを書いてませんでした(´・ω・`)三

指摘ありがとうございます!v-290
コピーコンストラクタと、あと代入演算子の方もprivate属性に追記しておきますv-411

シングルトン

 このあたりはポリシーの問題ではあるのですが、最後に Destroyを呼び忘れてしまった・呼べなかった場合 newしたオブジェクトが解放されないまま main関数を終えること考えられるのですが、そのケースには対応しなくいいのでしょうか?

No title

今は個人だけで制作しているので、
"Destroy()は必ず呼ばれる"という前提で開発していますが、
これは プログラムとしては安全ではないですねv-292

スマートポインタや、エラーに対する処理を実装すべきでした。v-394

対処法として 一番手っ取り早いのは、newしたポインタではなく
インスタンスの参照を返す
方法でしょうか。

とりあえず、参照で返した方がメモリリークの心配は無いので、
そのように記事のコードを変更してみますv-411
(コードの詳細は書いてませんが、Template Factoryの方も
修正して開発を進めようかな、と思います)

No title

>インスタンスの参照を返す
 概ねそれで問題ないと思います。
(個人的には new + atexit方式が好みだったりします)

No title

分かりました 有り難うございます!v-290

あと、atexitは知りませんでした。
(exitの方だけなら知っていたのですが)

というより、標準のライブラリでも全然使ったことの無い関数や、
知らない関数が結構あります。

良い機会ですので、標準ライブラリの関数などを
ざっと全部 目を通してみようかな、と思いますv-290
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。