Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Singleton и реализация

#cpp


Если я создаю класс в качестве одиночки, то нужно ли реализовать оперетор присваивания,
конструктор копирования, операторы сравнения классов и т.д? Как их вообще записать?
Просто без объявить, но не писать реализацию?
И заодно спрошу, как реализовать Singleton, если объект класса будет создаваться как
Class * c = new Class();

а не так 
Class c;
    


Ответы

Ответ 1



Классический (и наиболее изящный) метод объявления синглтона на C++ — синглтон Майерса. Пример: class Singleton { public: static Singleton& Instance() { // согласно стандарту, этот код ленивый и потокобезопасный static Singleton s; return s; } private: Singleton() { ... } // конструктор недоступен ~Singleton() { ... } // и деструктор // необходимо также запретить копирование Singleton(Singleton const&); // реализация не нужна Singleton& operator= (Singleton const&); // и тут }; Начиная с C++11, правильнее писать так: Singleton(Singleton const&) = delete; Singleton& operator= (Singleton const&) = delete; Теперь по пунктам: Оператор присваивания не нужен. Поскольку он во многих случаях создаётся компилятором «за вашей спиной», нужно задекларировать его приватным, чтобы им никто не мог воспользоваться. В C++11 вы можете прямо убрать его при помощи конструкции «= delete». То же для конструктора копирования. В операторах сравнения нет нужды, так как всё равно есть лишь один экземпляр. Поскольку автоматически операторы сравнения не создаются, вам не нужно ни о чём беспокоиться. Использовать синглтон, создавая его явно, нельзя: ведь если вы смогли объявить один экземпляр, то сможете объявить сколько угодно! Поэтому варианты «ручного» создания мы исключили, сделав конструктор приватным. Получить ссылку на синглтон для работы с ним можно только так: Singleton& instance = Singleton::Instance();

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

Отправить комментарий