c++ - 禁止复制构造函数和赋值运算符单例类

标签 c++ singleton

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

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= 都是无用的。所以,我可以跳过将这些声明为私有(private)的,我错了吗?

最佳答案

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

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)。

关于c++ - 禁止复制构造函数和赋值运算符单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375251/

相关文章:

c++ - 哪些稳定的 c++11 特性可以安全使用

c++ - pop_back() 返回值?

c++ - Portaudio 回调函数示例

java - java中SomeObject.class的含义是什么?

c++ - 单例,奇怪的重复模板模式和转发构造函数参数

c++ - 在 std::map 中打印迭代器的索引

c++ - wxWidgets - wxListbook 列表的宽度

python - 实现单例类和(b)锁定问题?

抽象类中的 Java 延迟加载单例

ios - objective c和swift中单例类的使用