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

singleton_4.cpp

#include <stdio.h>
#include <memory>
using namespace std ;

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

//

class Singleton {
private:
    friend auto_ptr<Singleton> ; // protect デストラクタにアクセスするため
    static auto_ptr<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") ;
    }

public:
    static Singleton* Instance() ;

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

//  Singletonクラスの実装

auto_ptr<Singleton> Singleton::_instance ;

Singleton* Singleton::Instance() {
    if (_instance.get() == 0) {
        _instance = auto_ptr<Singleton>(new Singleton) ; // 一つだけ生成。
    }

    return _instance.get() ;
}

// 使用

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 ;
}