Как это заставляет синглтон? - PullRequest
1 голос
/ 28 сентября 2011

В некотором коде я видел шаблон синглтона

template<typename T>
class Singleton
{
public:
    Singleton(T& instance)
    {
        assert(!sfpInstance || (sfpInstance==&instance));
        sfpInstance = &instance;
    }
    static T& getInstance()
    {
        assert(sfpInstance);
        return *sfpInstance;
    }
private:
    static T*   sfpInstance;
};

И классы, используемые следующим образом:

class MyClass : public Singleton<MyClass>
{
   protected:
      MyClass() : Singleton<MyClass>(*this) {}
}

Я не знаю, как это можно использовать как синглтон?

Если это можно использовать, как правильно его использовать.

РЕДАКТИРОВАТЬ: конструктор MyClass защищен.

1 Ответ

1 голос
/ 28 сентября 2011

Этот код не будет работать вообще, так как нет общедоступного конструктора MyClass, а Singleton не является другом MyClass.

Теперь, если конструктор MyClass / was / public, каждый вызов конструктора MyClass проверяет, указывает ли глобальный указатель sfpInstance куда-либо объект, и запускает утверждение, если это так. Таким образом, только один экземпляр MyClass может быть создан во время выполнения программы. Обратите внимание, что этот метод не очень элегантен, так как он не отслеживает разрушение одноэлементного экземпляра MyClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...