Warning: array_keys() expects parameter 1 to be array, object given in /export/sd09/www/jp/r/e/gmoserver/8/7/sd0135687/torokeru.tv/mameblog/wordpress-2.8.2-ja-undernavicontrol/wp-content/plugins/script-compressor/script-compressor.php on line 348

Warning: max(): When only one parameter is given, it must be an array in /export/sd09/www/jp/r/e/gmoserver/8/7/sd0135687/torokeru.tv/mameblog/wordpress-2.8.2-ja-undernavicontrol/wp-content/plugins/script-compressor/script-compressor.php on line 348
C++ | まめも

Category Archives: C++

シングルトンのテンプレートって

久々にC++でシングルトンを書く事があって、昔はテンプレート化してたなーと思いつつ
「シングルトン テンプレート」で、ぐぐれば色んなエントリー出るんですね。
多様な書き方があるなーと思いつつ、久々にシングルトン書いてみた。

#ifndef __SINGLETON__
#define __SINGLETON__

/*! @class Singleton
    @brief シングルトン
*/       
template <typename T> class Singleton
{
private:
    /** コンストラクタ */
    Singleton(void)
    {
    }

    /** デストラクタ */
    ~Singleton(void)
    {
    }

    /** コピーコンストラクタ(使用禁止) */
    Singleton(const Singleton& single);

    /** 代入演算子(使用禁止) */
    const Singleton& operator = (const Singleton& single);

public:
    /*! 共通ポインタの取得
    @param[in]      none
    @return         T 唯一の静的インスタンス
    @exception      none
    */
    static T* sharedSingletonPtr(void)
    {
        if (!_pSingleton) _pSingleton = new T();
        return _pSingleton;
    }

private:
    static T*  _pSingleton;            //!< 唯一のインスタンス
};

//---- 唯一のインスタンス静的変数
template <typename T> T* Singleton<T>::_pSingleton = NULL;

#endif  //__SINGLETON__

で、これを使う側。

class Hoge : public Singleton<Hoge>
{
friend Singleton<Hoge>;
private:
/** コンストラクタ /
Hoge();
/* デストラクタ */
virtual ~Hoge();

public:
int getPiyo()
{
    return piyo;
}
private;
int piyo;
}

/*! @brief アクセスインターフェース
/ 
inline Hoge* HogePtr(void)
{
    return Singleton<Hoge>::sharedSingletonPtr();
}

言いたい点はここ

friend Singleton<Hoge>;
private:
/** コンストラクタ /
Hoge();
/* デストラクタ */
virtual ~Hoge();

コンストラクタ部分をpublicにしている人もいるけど、そもそもpublicにしてしまうと、
Hoge hoge;
でインスタンスつくれてしまう

wikiでもいうとおり、

そのクラスのインスタンスが1つしか生成されないことを保証することができる

というからには、privateにする必要がある。
ただ、そうなると、singleton.hで

if (!_pSingleton) _pSingleton = new T();

が呼び出せなくなってしまうので、

friend Singleton<Hoge>;

でSingletonからはアクセス可能にする為、穴をあける。

// Example:
HogePtr()->getPiyo();