C++11の機能を使ってシングルトンの実装をしてみる

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

C++11の機能を使ってシングルトンの実装をしてみる

投稿記事 by naohiro19 » 10年前

sp1章. 一つしかないことが保証できるsingletonにあるコードは現状のコードは以下のようになっています。

CODE:

/***** 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";
	}

};
となっていますが、C++11(Visual Studio 2013)の機能を使って実装すると以下の実装が簡単になります(コンパイラが生成する関数へのdefault/delete指定(ウィキペディア記事))。

CODE:

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

#pragma once

class Singleton {
public:
	Singleton() = delete; //これに変更
	Singleton(const Singleton& r) = delete; //これに変更
	Singleton& operator=(const Singleton& r) = delete; //これに変更
     

	static Singleton* Instance() {
		static Singleton* inst;
		return inst; //&inst; を inst; に訂正(間違えてました)
	};

	const char* get(){
		return "singleton";
	}
};
とするだけでコンパイラはコンストラクタ、デフォルトコンストラクタ、演算子の生成を禁止にすることができます。
最後に編集したユーザー naohiro19 on 2013年11月01日(金) 09:18 [ 編集 3 回目 ]

YuO
記事: 947
登録日時: 13年前

Re: C++11の機能を使ってシングルトンの実装をしてみる

投稿記事 by YuO » 10年前

デフォルトコンストラクタはdeleteしてはいけませんね。
privateで残す or 別のコンストラクタを用意する必要があります。
このままだと, Singleton::Instanceが返すポインタを使うことは,undefined-behaviorです (実体はどこ?)。