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

singleton_0.cpp

#include <stdio.h>

// デザインパターン - Singleton - _instanceを Instance()内で staticな変数として宣言する例

//

class Singleton {
private:
    int*   m_pi ;

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

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

public:
    // デストラクタを publicにしないと、Instance()内の static変数 _instance がデストラクトできない。
    ~Singleton(){
        delete m_pi ;
        m_pi = 0 ;
        printf("Singleton デストラクト\n") ;
    }

    static Singleton* Instance() ;

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

//  Singletonクラスの実装

Singleton* Singleton::Instance() {
    static Singleton   _instance ;
    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()) ;

    delete Singleton::Instance() ; // #! こんなコードがコンパイルができてしまう。(デバグモードなら実行時にここでASSERTにひっかかる)

    try{
        printf("%d\n", get()) ;   // #! リリースモードだとなにごともなくここまで来るが、
    }catch(...){
        printf("bad Singleton::_instance.\n") ;   // #! メンバ(m_pi) はデストラクタにより NULLポインタになってるので、例外発生。
    }

    return 0 ;
}