Daily bit(e) C++. Паттерн Синглтон

Добавлено 5 октября 2026 в 16:52

Daily bit(e) C++ 138, простейшая реализация паттерна «Одиночка» (Singleton), также известная как «синглтон Скотта Мейерса».

Daily bit(e) C++

По возможности следует избегать использования синглтонов, так как они усложняют процесс тестирования. Однако иногда глобальное состояние оказывается наименьшим из зол.

Если вам необходим синглтон, можно использовать простую функцию-геттер, возвращающую ссылку на локальную статическую переменную.

Инициализация статических переменных с локальной областью видимости (внутри блока) выполняется потокобезопасно и с соблюдением гарантий безопасности при возникновении исключений.

struct GlobalData 
{
    int state;
private:
    // Опционально: запретить создание GlobalData
    // за пределами get_global_data()
    GlobalData(int state) : state(state) {}
    friend GlobalData& get_global_data();
};

// также известная как «синглтон Скотта Мейерса»
GlobalData& get_global_data() 
{
    // Статические переменные с блочной областью видимости имеют
    // статическое время жизни и инициализируются при первом прохождении
    // потока управления через их объявление;
    // при этом обеспечивается потокобезопасность.
    static GlobalData storage{42};
    return storage;

    // Примечание: если при инициализации возникнет исключение,
    // попытка будет повторена при следующем проходе.
}

// get_global_data().state == 42

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Одиночка / SingletonПаттерны проектирования / Design PatternsПрограммирование