#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. Более того, вам придется создать экземпляр на некоторой стадии инициализации, тогда как в стандартном синглтоне у вас обычно есть отложенная инициализация.