如果你不介意多重继承(毕竟没那么糟糕),你可以用私有复制构造函数和赋值运算符编写简单的类,并附加子类:
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
不过,我不太确定这是否适用于每个编译器。有一个related question,但还没有答案。
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 {
};
如果您的项目政策允许,我建议您坚持使用 Boost 的解决方案。另请参阅另一个 boost::noncopyable-related question 了解更多信息。