Необходимость приватизационного присвоения оператора в классе Singleton - PullRequest
7 голосов
/ 12 июля 2011

Может ли кто-нибудь обосновать необходимость приватизации оператора присваивания в реализации класса Singleton?

Какую проблему она решает, сделав Singleton& operator=(Singleton const&); приватной?

class Singleton {
public:
  static Singleton& Instance() {
    static Singleton theSingleton;
    return theSingleton;
  }

private:
  Singleton(); // ctor hidden
  Singleton(Singleton const&); // copy ctor hidden
  Singleton& operator=(Singleton const&); // assign op. hidden
  ~Singleton(); // dtor hidden
};

Ответы [ 7 ]

11 голосов
/ 12 июля 2011

Присвоение одиночному объекту - это просто бессмысленная операция, поскольку должен существовать только один его объект.

Закрытие оператора присваивания помогает диагностировать бессмысленный код, например:

Singleton& a = Singleton::Instance();
Singleton& b = Singleton::Instance();
a = b; // Oops, accidental assignment.
2 голосов
/ 12 июля 2011

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

2 голосов
/ 12 июля 2011

Там только один синглтон.Нет смысла копировать его.Вам нужно две вещи, чтобы копия была в здравом уме, и большинству операторов копирования нужно проверять наличие self==&other, чтобы быть в безопасности.

Этот трюк private является взломом. C ++ 0x делает это лучше.

Начало разглагольствования ...

ИМХО Синглтон - это противоречие в терминах.Это продукт глупой идеи, что все должно быть объектом для инкапсуляции.Это та же самая головная боль, которую несут Java Math.sin(x) и др.

Ваша жизнь станет проще, если «синглтон» - это просто набор свободных функций в пространстве имен.Любые частные «члены» синглтона могут быть скрыты в анонимном пространстве имен в .cpp.Инкапсуляция достигнута, и у вас нет этого громоздкого дополнительного синтаксиса.

MyNamespace :: foo ();

вместо

MyClass :: instance () .foo ();
1 голос
/ 12 июля 2011

Если сделать оператор присваивания закрытым, это ничего не изменит, так как вам нужно два экземпляра, чтобы иметь возможность назначать. Это соответствует что люди могут ожидать увидеть; это обычно, что если копия конструктор является приватным, оператор присваивания также. Объявление Частное назначение оператора просто соответствует ожиданиям людей.

0 голосов
/ 27 сентября 2011

Inherit boost :: noncopyable (private) в шаблоне синглтон-класса, чем для определения конструкции частного копирования и оператора присваивания.

0 голосов
/ 12 июля 2011

Я рассуждаю так: если может быть только один экземпляр, оператор = может быть определен без проблем, поскольку он не будет делать ничего существенного.если мы сделаем его закрытым, компилятор добавит еще один уровень безопасности, отметив любую попытку использовать этот оператор как ошибку.

Кстати, то же самое относится и к деструктору.

0 голосов
/ 12 июля 2011

Когда вы используете синглтон, вы реализуете его потому, что вам нужен только один экземпляр объекта этого класса. Другими словами, нет необходимости делать копию экземпляра, потому что вы можете иметь только один экземпляр. То же самое для конструктора копирования.

...