【问题标题】:prohibit copy constructor and assignment operator singleton class禁止复制构造函数和赋值运算符单例类
【发布时间】:2018-07-17 07:10:06
【问题描述】:

我正在用 C++ 实现 Singleton 类,我想知道是否有必要将复制构造函数和赋值运算符声明为私有,以防我有以下实现

class Singleton{

static Singleton* instance;

Singleton(){}

public:


static Singleton* getInstance();

};

Singleton* Singleton::instance = 0;
Singleton* Singleton::getInstance(){

    if(instance == 0){
        instance = new Singleton();
    }
    return instance;
} 

似乎我只能拥有指向 Singleton 的指针,在这种情况下,复制构造函数也没用,operator= 也是如此。所以,我可以跳过将这些声明为私有,我错了吗?

【问题讨论】:

标签: c++ singleton


【解决方案1】:

没有什么可以阻止某人写作

Singleton hahaNotReallyASingleton = *Singleton::getInstance();

具体可以mark these functions as deleted:

class Singleton {
    // ... other bits ...

    Singleton(Singleton const&) = delete; // copy ctor
    Singleton(Singleton &&)     = delete; // move ctor
    Singleton& operator=(Singleton const&) = delete; // copy assignment
    Singleton& operator=(Singleton &&)     = delete; // move assignment
};

请注意,以这种方式使用deleteC++11 及以后 - 如果您使用较旧的代码库,您可以创建函数private(仅复制,当然不能移动),或从@ 继承987654322@(感谢badola)。

【讨论】:

  • 谢谢,我没有考虑过这种情况,我以为我不能拥有该类的对象
  • 请注意,删除的函数仅允许 C++11 及更高版本。对于 C++11 之前的版本,需要类似于 boost::noncopyable 的构造。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2012-10-05
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多