Se você não se importa com a herança múltipla (afinal, não é tão ruim assim), você pode escrever uma classe simples com o construtor de cópia privada e o operador de atribuição e subclassificá-la adicionalmente:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Para o GCC, isso fornece a seguinte mensagem de erro:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Não tenho muita certeza de que isso funcione em todos os compiladores. Existe uma pergunta relacionada , mas sem resposta ainda.
UPD:
No C ++ 11, você também pode escrever a NonAssignable
classe da seguinte maneira:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
A delete
palavra-chave impede que os membros sejam construídos por padrão, portanto, eles não podem ser usados mais nos membros construídos por padrão de uma classe derivada. Tentar atribuir gera o seguinte erro no 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:
O Boost já tem uma classe para o mesmo propósito, acho que é implementada de maneira semelhante. A classe é chamada boost::noncopyable
e deve ser usada como a seguir:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Eu recomendaria seguir a solução do Boost se a política do seu projeto permitir. Consulte também outra boost::noncopyable
pergunta relacionada para obter mais informações.