2012-04-15 41 views
5

我知道为什么要使默认构造函数和复制构造函数专用于在C++中实现单例类。但我不明白的是为什么要使复制赋值运算符是私人的,因为不会有两个现有的对象开始。为什么重载C++中的单例类的复制赋值操作符?

我的探索带来了两点:

  1. 据Alexandrescu的“现代C++设计”,赋值 运营商进行私人防止自赋值。

  2. 其次,根据rule of three,如果定义构造函数中的一个, 拷贝构造函数和赋值操作符的一类,你应该定义 明确所有三个。那么,是否仅仅遵循这个规则 。

那么,你对此有何看法呢?

+0

我不质疑Alexandrescu的解释!我想知道是否存在技术原因,或只是告知客户程序员分配已被阻止?因为如果我们不声明op =,那么程序员的构造就像p1 = p2会默默地传递。 – 2012-04-15 12:26:49

+0

如果你使用Singleton,那么你的设计已经非常糟糕,可以试着遵循三法则。 – Puppy 2012-04-15 14:32:29

+0

你真的想让它编译吗? 'S :: getInstance()= S :: getInstance();' – 2012-04-15 16:18:25

回答

2

在辛格尔顿要管理所有可能的建设,分配和破坏。通过执行所有这些操作private,您实际上只是防止他人使用它们。

另外请注意,通常拷贝构造和拷贝分配将被声明为private,以防止从外部调用,但不会被定义,因为它们在实践中不被使用...并且因此如果它们是链接器将会抱怨。

在C++ 11中,您将声明复制构造和复制分配为delete d。

+1

如果我正确理解OP,如果构造函数是私有的,则不能使用复制赋值,因为没有人能够构造有效的lhs - 分配情况)。 – Vlad 2012-04-15 12:27:35

+0

@Matthieu:是否有必要声明op =还是这是一个样式问题? – 2012-04-15 12:38:26

+0

@RajendraUppal:它不只是一个风格问题。应该禁止无意义的操作,以便消息清晰:用户被警告说他做了一些无意义的事情,并且可以做出适当的反应。 – 2012-04-15 13:02:47

4

我认为,禁止分配的必要性更多的是语义考虑:因为单身人士是唯一,它的分配没有任何意义。因此,如果以合理的方式实现分配在技术上甚至是可能的,那么无论如何您需要禁止它。

所以正是因为一定不会需要复制一个单例,所以必须禁止该操作。否则就会出现混淆和错误的空间:开发者尝试使用它(如果允许的话)(并想知道什么是错的)。

良好的设计最大限度地减少了WTF的数量。

+0

但是,让我们决定不提供它,即使客户端程序员正在做类似于p1 = p2的操作(两者都从调用GetInstance()中接收到),自我分配将静默运行并且没有伤害,因为它们都指向同样的例子。 – 2012-04-15 12:34:48

+1

@Rajendra:好的,他们会想知道为什么他们的代码不起作用 - 哪个不好。虽然从技术上讲它可能是可能的。良好的设计不仅关乎技术的正确性,而且还关乎帮助人们看到发生了什么。 – Vlad 2012-04-15 12:37:49

+0

那么,他们在编译和运行之前就已经意识到了吗? – 2012-04-15 12:39:36

相关问题