Индивидуальное одиночное наследование для каждой иерархии - PullRequest
2 голосов
/ 01 апреля 2012

ОО Дизайн вопрос.

Я хочу унаследовать одноэлементную функциональность в разных иерархиях классов. Это означает, что они должны иметь свой собственный экземпляр singleton на иерархию.

Вот краткий пример того, что я пытаюсь сделать:

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 в качестве ключа?

Буду очень признателен за ваши мысли.

1 Ответ

5 голосов
/ 01 апреля 2012

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();
...