Скройте конструктор, запретите копирование и возвращайте ссылку на локальный static-объект. Начиная с C++11 его первоначальная инициализация защищена от одновременного выполнения потоками.
Класс‑одиночка (Singleton) в стиле глобального доступа
Скройте конструктор, запретите копирование и возвращайте ссылку на локальный static-объект. Начиная с C++11 его первоначальная инициализация защищена от одновременного выполнения потоками.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте класс, реализующий паттерн Singleton, так чтобы в процессе работы программы существовал ровно один его объект, доступный из любой точки кода.
class MySingleton {
// реализовать по шаблону Singleton
};
Ответ
Скройте конструктор, запретите копирование и возвращайте ссылку на локальный static-объект. Начиная с C++11 его первоначальная инициализация защищена от одновременного выполнения потоками.
class MySingleton {
MySingleton() = default;
~MySingleton() = default;
public:
MySingleton(const MySingleton&) = delete;
MySingleton& operator=(const MySingleton&) = delete;
static MySingleton& instance() {
static MySingleton object;
return object;
}
};
Защита инициализации не делает методы объекта потокобезопасными. Также учитывайте зависимости при завершении программы и границы динамических библиотек: такой шаблон не является межпроцессным singleton. Глобальный доступ затрудняет подмену зависимостей в тестах.