ホームへ戻る

 sp1章. 一つしかないことが保証できるsingleton

 デザインパターンの一つに singleton があります。
これを使えば一つしかインスタンスが存在しないことが保証できます。

キーボード等のように一つの端末に一つしか存在しないようなクラスのインスタンスを作る時、
誤って複数作ってしまったりするようなことがないようこのsingletonが使われることが多いです。

例えば

MyClass *c1 = new MyClass();
MyClass *c2 = new MyClass();

このように書けば普通はいくつもインスタンスが作れます。

しかしsingletonを使えばnewを使うことが無く、必ずシステムで一つしかインスタンスを持つことができません。
それではそのコードを見てみましょう。


/***** Singleton.h ******/

#pragma once

class Singleton {

private:
	Singleton() {}

public:
	static Singleton* Instance() {
		static Singleton inst;
		return &inst;
	};

	const char* get(){
		return "singleton";
	}

};


デフォルトコンストラクタをprivateにするのがポイントです。
デフォルトコンストラクタをprivateにしてしまうと、外部から生成できませんから、普段publicにすると思います。
しかしこうすることで、外部から生成できなくすることができます。
ではどうやってこのクラスを使用するのかというと、Instance関数を使います。
本クラスのインスタンスは本クラス内で持っています。
外部からはそのインスタンスを貰ってから扱います。

get関数は私が勝手に作ったもので、"singleton"という文字列を返すだけの関数ですが、
これを外部から呼ぶには、まずSingleton::Instance()を使ってSingletonのインスタンスを取得してから、->get()でアクセスします。

ではmain.cppからこれを使っているコードを見てみましょう。


/***** main.cpp *****/

#include "DxLib.h"
#include "Singleton.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()== 0 ){
		DrawString(0,0,Singleton::Instance()->get(),GetColor(255,255,255));
	}

	DxLib_End();
	return 0;
}


このようにして、getを参照します。

しかしこんなことをして何が得なのでしょうか。
では実際に次の「キーを押しているフレーム数を取得する」の節でsingletonを使ってみましょう。


なお、singletonはデフォルトコンストラクタをprivateにするだけでは、唯一であることが保証できず、
更にコピーコンストラクタと代入演算子のオーバーライドをprivateにすることで完全に唯一になります。


/***** Singleton.h ******/

#pragma once

class Singleton {

private:
	Singleton(){}
	Singleton(const Singleton& r){}
	Singleton& operator=(const Singleton& r){}
    
public:
	static Singleton* Instance() {
		static Singleton inst;
		return &inst;
	};

	const char* get(){
		return "singleton";
	}

};



→分からないことがあれば掲示板で質問して下さい


- Remical Soft -