Как это приводит к синглтону?

#c #templates #singleton

#c #шаблоны #синглтон

Вопрос:

В каком-то коде я видел шаблон singleton

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

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

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

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

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

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

Комментарии:

1. Короткий ответ: «Не используйте синглтоны, они злые и их невозможно отлаживать».

2. Конструктор в Singleton должен быть защищен.

3. Правильный способ использования синглтона — это совсем не так.

Ответ №1:

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

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

Комментарии:

1. конструктор MyClass защищен (или общедоступен, если требуется). Вопрос изменен

2. Более того, вам придется создать экземпляр на некоторой стадии инициализации, тогда как в стандартном синглтоне у вас обычно есть отложенная инициализация.