Notice : 内容無保証。禁無断転載。リンク自由。

singleton_3.cpp

#include <stdio.h>

// デザインパターン - Singleton - ユーザが生存期間を気にしなくて良い例1 (atexit())

//

class Singleton {
private:
    static Singleton*  _instance ;
    int*               m_pi ;

protected:
    // コピー抑止
    Singleton(Singleton& s){}
    Singleton& operator=(Singleton& s){return *this;}

    // クラス外でのコンストラクト抑止
    Singleton(){
        printf("Singleton コンストラクト\n") ;
        m_pi = new int(0) ;
    }

    // クラス外でのデストラクト抑止
    ~Singleton(){
        delete m_pi ;
        m_pi = 0 ;
        printf("Singleton デストラクト\n") ;
    }

    static void Destroy() ;

public:
    static Singleton* Instance() ;

    int i(void) const {return *m_pi ;}
    int i(int x) {*m_pi = x ; return x ;}
} ;

//  Singletonクラスの実装

Singleton* Singleton::_instance = 0 ;

void Singleton::Destroy(){
    delete _instance ;
}

Singleton* Singleton::Instance() {
    if (_instance == 0) {
        _instance = new Singleton ;    // 一つだけ生成して、
        atexit(Destroy) ;           // 終了時に消す
    }

    return _instance ;
}

// 使用

static void set(int i){
    Singleton::Instance()->i(i) ;
}

static int get(void){
    return Singleton::Instance()->i() ;
}

int main(void){
    set(10) ;
    printf("%d\n", get()) ;

    return 0 ;
}