Страницы

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

среда, 17 октября 2018 г.

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

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


Ответ

Классический (и наиболее изящный) метод объявления синглтона на 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();

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

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