禁用复制构造函数

我有一个class级:

class SymbolIndexer { protected: SymbolIndexer ( ) { } public: static inline SymbolIndexer & GetUniqueInstance ( ) { static SymbolIndexer uniqueinstance_ ; return uniqueinstance_ ; } }; 

我应该如何修改它以禁用代码:

 SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( ); 

并只允许像这样的代码:

 SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( ); 

您可以使复制构造函数是私有的,并且不提供任何实现:

 private: SymbolIndexer(const SymbolIndexer& that); 

或者在C ++ 11中,明确禁止它:

 SymbolIndexer(const SymbolIndexer& that) = delete; 

如果你不介意多重inheritance(毕竟这不是什么坏事),你可以编写一个带有私有拷贝构造函数和赋值操作符的简单类,并附加子类:

 class NonAssignable { private: NonAssignable(NonAssignable const&); NonAssignable& operator=(NonAssignable const&); public: NonAssignable() {} }; class SymbolIndexer: public Indexer, public NonAssignable { }; 

对于GCC这给出了以下错误消息:

 test.h: In copy constructor 'SymbolIndexer::SymbolIndexer(const SymbolIndexer&)': test.h: error: 'NonAssignable::NonAssignable(const NonAssignable&)' is private 

不过,我不确定这是否适用于每个编译器。 有一个相关的问题 ,但没有答案。

UPD:

在C ++ 11中,你也可以编写NonAssignable类,如下所示:

 class NonAssignable { public: NonAssignable(NonAssignable const&) = delete; NonAssignable& operator=(NonAssignable const&) = delete; NonAssignable() {} }; 

delete关键字防止成员被默认构造,所以他们不能在派生类的默认构造成员中继续使用。 尝试分配给GCC中的以下错误:

 test.cpp: error: use of deleted function 'SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)' test.cpp: note: 'SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)' is implicitly deleted because the default definition would be ill-formed: 

UPD:

Boost已经有一个类只是为了相同的目的,我想它甚至以类似的方式实现。 这个类被称为boost::noncopyable ,它的意思是用在下面:

 #include <boost/core/noncopyable.hpp> class SymbolIndexer: public Indexer, private boost::noncopyable { }; 

如果您的项目政策允许,我build议坚持Boost的解决scheme。 另请参阅另一个boost::noncopyable相关的问题了解更多信息。

使SymbolIndexer( const SymbolIndexer& )私有。 如果您正在分配参考,则不会复制。