Якщо ви не заперечуєте проти багатократного успадкування (зрештою, це не так вже й погано), ви можете написати простий клас із приватним конструктором копій та оператором присвоєння та додатково підкласифікувати його:
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 {
};
Я рекомендую дотримуватися рішення Boost, якщо ваша проектна політика дозволяє. Дивіться також ще одне boost::noncopyable
пов'язане питання для отримання додаткової інформації.