禁用复制构造函数
我有一个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& )
私有。 如果您正在分配参考,则不会复制。