禁止复制构造函数和赋值运算符singleton类

时间:2018-07-17 07:10:07

标签: c++ singleton

我正在用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=也没有用。因此,我可以跳过将它们声明为私有的操作,我错了吗?

1 个答案:

答案 0 :(得分:2)

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

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(仅复制,当然不能移动) ),或从boost:noncopyable继承(感谢badola)。