有人能证明在单例类实现中将赋值运算符私有化的必要性吗?
通过将Singleton& operator=(Singleton const&);设置为私有,它解决了什么问题?
class Singleton {
public:
static Singleton& Instance() {
static Singleton theSingleton;
return theSingleton;
}
private:
Singleton(); // ctor hidden
Singleton(Singleton const&); // copy ctor hidden
Singleton& operator=(Singleton const&); // assign op. hidden
~Singleton(); // dtor hidden
};发布于 2011-07-12 23:08:37
单例赋值只是一种无意义的操作,因为它只有一个对象应该存在。
将赋值操作符设置为私有有助于诊断无意义的代码,如下所示:
Singleton& a = Singleton::Instance();
Singleton& b = Singleton::Instance();
a = b; // Oops, accidental assignment.发布于 2011-07-12 23:08:01
只有一个单例。复制它没有任何意义。你需要做两件事才能使拷贝正常,而且大多数拷贝操作员为了安全起见需要检查self==&other。
这个private技巧是一个黑客技巧。C++0x does it better.
开始咆哮..。
我认为单例在术语上是矛盾的。它是一种愚蠢的想法的产物,即所有东西都必须是对象才能被封装。这也是让Java的Math.sin(x)等人感到头疼的地方。
如果"singleton“仅仅是名称空间中的一组自由函数,那么您的工作将会更简单。单例的任何私有“成员”都可以隐藏在.cpp的匿名命名空间中。实现了封装,而且您没有繁琐的额外语法。
MyNamespace :: foo ();而不是
MyClass :: instance () .foo ();发布于 2011-07-12 23:09:31
如果只需要一个实例,则复制构造函数应该是私有的。赋值运算符访问说明符并不重要,因为无论如何都不可能使用它。
https://stackoverflow.com/questions/6666413
复制相似问题