Статические объекты в классе (Singleton) - PullRequest
0 голосов
/ 17 октября 2019

Я смотрю на две реализации шаблона проектирования Singleton.

Я хотел бы знать, как работает второй, в частности:

  1. ПочемуАвтор выбрал возвращение БД в качестве ссылки.

  2. Почему статический класс DB объекта в getDatabaseConnection () не нужно определять вне класса SingleDatabase как таковой:

SingletonDatabase& SingletonDatabase::DB;
Может ли объект статического класса, подобно статической переменной, создаваться только один раз (и совместно использоваться всеми объектами одного и того же класса)?

Реализация

class SingletonDatabase {
    private:
        SingletonDatabase() {
            std::cout << "Initializing database" << std::endl;
            instanceCount++; // Used in testing later on.
        }

    public:
        SingletonDatabase(const SingletonDatabase&) = delete;
        SingletonDatabase& operator=(const SingletonDatabase&) = delete;
        static SingletonDatabase& getDatabaseConnection() {
            static SingletonDatabase DB;
            return DB;
        }
        static int instanceCount;
};

int SingletonDatabase::instanceCount = 0;

Я привык видеть реализацию со статическим указателем, который автор упомянул как поточно-ориентированный. Он предпочитает этот метод.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 октября 2019
  1. Почему автор решил вернуть БД в качестве ссылки.

Вместо ссылки можно было бы использовать и указатель. Ссылка лучше выражает, что pointee предоставлен для существования. (Возврат по значению вместо этого повредил бы концепцию.)

Почему статический класс DB объекта в getDatabaseConnection () не нужно определять вне класса SingleDatabase как таковой:

SingletonDatabase& SingletonDatabase::DB;

Это не такпеременная-член, но переменная static с локальной областью действия, но временем жизни статического → предоставленного для существования от первого доступа до конца процесса.

SO: Что такое время жизнистатическая переменная в функции C ++? (немного устаревшая, но все еще правильная)

Это работало бы так же, как в простой функции. То, что окружающая функция является (static функцией-членом), не имеет к этому никакого отношения.

Может ли объект статического класса, как и статическая переменная, создаваться только один раз (и совместно использоваться всеми объектами одного и того же класса)?

Да.

Если быть точным, он используется всеми участниками этой функции.


Кстати. это известно как Meyers Singleton :

FleCSI: синглтон Meyer SO: C ++ Шаблон проектирования Singleton

SO: Безопасна ли реализация Мейерсом потока шаблона Singleton?

0 голосов
/ 17 октября 2019

Для завершения баллов @ Scheff:

Я привык видеть реализацию со статическим указателем, который, как упомянул автор, не является поточно-ориентированным. Он предпочитает этот метод.

Как показывает этого Q / A , реализация одноэлементного шаблона с указателями не является поточно-ориентированной.

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