Если вы не возражаете против множественного наследования (в конце концов, это не так уж и плохо), вы можете написать простой класс с конструктором приватного копирования и оператором присваивания и дополнительно создать его подкласс:
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
Я не очень уверен, что это сработает в каждом компиляторе. Eсть связанный вопрос , но пока без ответа.
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
связанный вопрос для получения дополнительной информации.