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'」って怒られる。
(インクルードガードはしたつもりなのに。)
何とかならんのか。