Если я создаю класс в качестве одиночки, то нужно ли реализовать оперетор присваивания, конструктор копирования, операторы сравнения классов и т.д? Как их вообще записать? Просто без объявить, но не писать реализацию? И заодно спрошу, как реализовать 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();
Комментариев нет:
Отправить комментарий