2012-03-31 18 views
2

OO設計に関する質問。各階層の個々のシングルトン継承

シングルトン機能をクラスの異なる階層に継承したいと考えています。つまり、階層ごとに独自のインスタンスを持つ必要があります。

class CharacterBob : public CCSprite, public BatchNodeSingleton { 
... 
} 

class CharacterJim : public CCSprite, public BatchNodeSingleton { 
... 
} 


class BatchNodeSingleton { 
public: 
    BatchNodeSingleton(void); 
    ~BatchNodeSingleton(void); 

    CCSpriteBatchNode* GetSingletonBatchNode(); 
    static void DestroySingleton(); 
    static void initBatchNodeSingleton(const char* asset); 

protected: 
    static CCSpriteBatchNode* m_singletonBatchNode; 
    static bool singletonIsInitialized; 
    static const char* assetName; 
}; 

このコードはBatchNodeSingletonの保護されたメンバーを共有するためにジムとボブが発生します。

は、ここで私が何をしようとしています何の簡単な例です。私は彼らにそれぞれ独自のセットを持たせる必要があります。良い解決策は何でしょうか? assetNameがキーとして参照できるポインタのコレクション?

本当に感謝しますか?

+0

あなたが正しい、私は必要なもの派生オブジェクトの階層ごとにクラスの単一のインスタンスです。数千のジムがあるかもしれませんが、それらはすべてCCSpriteBatchNodeの単一のインスタンスを必要とします –

答えて

5

CRTPが人気のパターンです:

template <typename T> struct Singleton 
{ 
    static T & get() 
    { 
     static T instance; 
     return instance; 
    } 
    Singleton(Singleton const &) = delete; 
    Singleton & operator=(Singleton const &) = delete; 
protected: 
    Singleton() { } 
}; 

class Foo : public Singleton<Foo> 
{ 
    Foo(); 
    friend class Singleton<Foo>; 
public: 
    /* ... */ 
}; 

使用法:

Foo::get().do_stuff(); 
+0

華麗な、ありがとう! –

関連する問題