最も優雅なC++単例類の書き方だと思います


class Singleton
{
public:
    static Singleton  &instance() {
        static Singleton singleton;
	    return singleton;
	}
    Singleton (Singleton &&) = delete;
    Singleton (Singleton  const&) = delete;

private:
    Singleton() = default;
};

その中のポイント:
  • はstaticローカル変数によって一意のオブジェクトを定義し、C++11では手動ロックによるスレッドの安全を保証する必要はありません.C++working paperは次のように説明します.
    If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
  • コピーコンストラクタと移動コンストラクタを削除します.新しいオブジェクトが生成されると必ずコンストラクション関数が呼び出されるため、レプリケーションオペレータの再ロードを管理する必要はありません.
  • は、使用するコンストラクション関数をprivateとして定義する.コンストラクション関数にコードが不要な場合は、defaultを直接割り当てることができます.

  • 使用方法
    Singleton  &singleton = Singleton ::instance();