在单例设计模式中使用复制构造函数和赋值运算符

时间:2014-11-25 08:25:42

标签: c++ design-patterns singleton

我对Singleton设计模式的疑问是,只要将构造函数设为私有就足够了。 我认为没有必要将复制构造函数和赋值运算符设为私有。

由于我们无法创建对象,(对象将由静态函数创建并将在静态指针中分配),因此不会调用复制构造函数或赋值运算符。这是对的吗?

2 个答案:

答案 0 :(得分:1)

那是错的。如果您收到指向内部分配的实例的指针,如果复制构造函数是公共的,您仍然可以复制它。例如:

Singleton * s = Singleton::getInstance();

Singleton copy = *s;   // <-- invokes copy constructor

赋值运算符的类似问题:

Singleton * s1 = Singleton::getInstance();
Singleton * s2 = Singleton::getInstance();

*s1 = *s2;    // <-- invokes assignment operator (although self-assignment...)

这些都不会造成太大的伤害,但是它们违反了Singleton模式的意图。

通过将复制构造函数和赋值运算符设为私有,可以解决问题。从C ++ 11开始,您也可以通过编写

来“删除”它们
Singleton(const Singleton&) = delete;               // copy constructor
Singleton & operator=(const Singleton&) = delete;   // assignment operator

答案 1 :(得分:1)

不需要将复制构造函数(和赋值运算符)设为私有,因为默认情况下它们将使用浅复制。但是,为什么要在Singleton类中实现复制构造函数?如果你实现了一个拷贝构造函数,并在其中实现深度复制,并保持公开,那么就可以创建该类的多个对象。

如果您使用的是C ++ 11,最好删除它们:

MyClass (MyClass const &) = delete;
MyClass & operator = (MyClass const &) = delete;