C++でSingletonパターンの実装

・・・をしてみた。

#include <iostream>
using namespace std;

class Singleton {
private:
    Singleton() {}
    Singleton(const Singleton& s) {}
    Singleton& operator = (const Singleton& s) {}
    
public:
    static Singleton* getInstance() {
        static Singleton instance;
        return 
    }
    
    int id;
};

class SingletonHolder {
public:
    SingletonHolder() {}
    
    void setId(int num) {
        Singleton::getInstance()->id = num;
    }
    
    int getId() {
        return Singleton::getInstance()->id;
    }
};

int main(void) {
    SingletonHolder *sh1 = new SingletonHolder();
    SingletonHolder *sh2 = new SingletonHolder();
    
    sh1->setId(3);
    sh2->setId(5);
    
    cout << sh1->getId();
    
    return 0;
}

実行結果

  5

まわりくどい・・・。もうちょっとなんとかならないか検討。

おまけ

Java風な実装はこっち。

#include <iostream>
class Singleton {
private:
    Singleton() {}
    Singleton(const Singleton& s) {}
    Singleton& operator = (const Singleton& s) {}
    static Singleton* instance;
    
public:
    ~Singleton() { delete instance; }
    static Singleton* getInstance() {
        if(instance == NULL) instance = new Singleton();
        return instance;
    }
    
    int id;
};

Singleton* Singleton::instance = NULL;

/* ..以下同様.. */

こっちの実装だと、複数のファイルからSingleton::instanceが使われる際に、gcc に「multiple definition of `Singleton::instance'」って怒られる。

(インクルードガードはしたつもりなのに。)

何とかならんのか。