【问题标题】:Use of copy constructor and assignment operator in singleton design pattern单例设计模式中复制构造函数和赋值运算符的使用
【发布时间】:2015-01-23 03:58:01
【问题描述】:

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

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

【问题讨论】:

  • 关键是禁止复制单例,这将使它不是单例。
  • 在 c++11 中,您可以删除复制构造函数和赋值运算符,这可以更好地表明意图。

标签: c++ design-patterns singleton


【解决方案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...)

这两者都不会造成太大的伤害,但它们违反了单例模式的意图。

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

Singleton(const Singleton&) = delete;               // copy constructor
Singleton & operator=(const Singleton&) = delete;   // assignment operator

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多