【问题标题】:Why private destructor in a Singleton class?为什么在 Singleton 类中使用私有析构函数?
【发布时间】:2016-06-05 13:11:25
【问题描述】:

我已经看到构造函数、复制构造函数、析构函数和赋值运算符在典型的单例类中保持在私有范围内。例如

class CMySingleton
{
public:
  static CMySingleton& Instance()
  {
    static CMySingleton singleton;
    return singleton;
  }

private:
  CMySingleton() {}                                  // Private constructor
  ~CMySingleton() {}
  CMySingleton(const CMySingleton&);                 // Prevent copy-construction
  CMySingleton& operator=(const CMySingleton&);      // Prevent assignment
};

现在,我的问题是

为什么要将析构函数和赋值运算符保密 范围?是强制性的吗?

公共析构函数会破坏单例类的任何属性吗? 因为由于我们的对象构造受到限制所以没有 意外破坏的可能性。

我可以理解私有赋值运算符可以防止 self 赋值,但公共赋值运算符是否会伤害其他 比额外的运行时间?

【问题讨论】:

  • 错误的问题。正确的问题是:为什么这个该死的愚蠢的单身人士首先存在?
  • @SergeyA:因为它在 GoF 的书中 :)

标签: c++ singleton


【解决方案1】:

将析构函数设为私有可能会阻止某人尝试在指向单例的指针上调用 delete

auto& singleton = CMySingleton::Instance();
auto pointer_to_singleton = &singleton;
delete pointer_to_singleton;  // Bad!

禁用赋值运算符可防止无害但无意义的自赋值。见this answer。如果有人这样做,很可能这是一个错误,所以你不妨阻止它。

【讨论】:

  • 我对私有ctor和copy-ctor毫不怀疑。不能使用赋值运算符创建新对象。除了在编译期间限制自赋值之外,公共范围是否会失败?
  • @paper.plane 你是对的。我已经修改了答案,只考虑赋值和析构函数。
【解决方案2】:

这里,私有析构函数没有任何用处。

对于复制构造函数和赋值运算符,您已经回答了自己的问题,方法是在显示的代码中努力重现它们旁边的 cmets。只需阅读 cmets 即可。唯一需要补充的是,这段代码必须在 C++11 之前,因为这些天你只会删除它们。

【讨论】:

  • 我对私有ctor和copy-ctor毫不怀疑。不能使用公共赋值运算符创建新对象。除了在编译期间限制自赋值之外,它是否打破了单例概念?
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2010-10-12
  • 2023-04-07
  • 2011-01-21
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
相关资源
最近更新 更多