需要在Singleton类中私有化赋值运算符

时间:2011-07-12 15:06:00

标签: c++ singleton assignment-operator

有人可以证明在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 个答案:

答案 0 :(得分:11)

对单身人士的分配只是一个无意义的操作,因为它只应该存在一个对象。

将赋值运算符设置为私有有助于诊断无意义的代码,例如:

Singleton& a = Singleton::Instance();
Singleton& b = Singleton::Instance();
a = b; // Oops, accidental assignment.

答案 1 :(得分:2)

只有一个单身人士。复制它是没有意义的。您需要两个的东西才能使副本变得清醒,并且大多数复制操作员需要检查self==&other才能安全。

这个private技巧是一个黑客。 C++0x does it better.

开始咆哮......

恕我直言,单身人士是一个矛盾的术语。这是一个愚蠢的想法的产物,所有必须是一个对象才能被封装。这与Java的Math.sin(x)等人的脑痛相同。

如果“singleton”只是命名空间中的一组自由函数,那么你的生活会更简单。单例的任何私有“成员”都可以隐藏在.cpp中的匿名名称空间中。实现了封装,并且您没有那种繁琐的额外语法。

MyNamespace :: foo ();

而不是

MyClass :: instance () .foo ();

答案 2 :(得分:2)

如果您只想要一个实例,则复制构造函数应该是私有的。赋值运算符访问说明符无关紧要,因为无论如何都无法使用它。

答案 3 :(得分:1)

将赋值运算符设为私有并不会真正改变任何东西, 因为您需要两个实例才能分配。它确实对应 人们可能期望看到的东西;通常,如果副本 构造函数是私有的,赋值运算符也是如此。宣布一个 私人任务操作员只是符合人们的期望。

答案 4 :(得分:0)

当您使用单例时,实现它的原因是因为您只需要该类对象的一个​​实例。换句话说,不需要复制实例,因为您只能有一个实例。复制构造函数也是一样。

答案 5 :(得分:0)

我的理由是:如果只有一个实例,可以定义operator =而没有问题,因为它不会做任何重要的事情。如果我们将其设为私有,编译器将通过标记任何将该运算符用作错误的尝试来增加一个安全级别。

顺便说一下,析构函数也有同样的理由。

答案 6 :(得分:0)

在单例类模式中继承boost :: noncopyable(私有),而不是定义私有拷贝构造和赋值运算符。