Se non ti dispiace l'ereditarietà multipla (dopotutto non è poi così male), puoi scrivere una classe semplice con il costruttore di copie private e l'operatore di assegnazione e inoltre sottoclassarlo:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Per GCC questo dà il seguente messaggio di errore:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Non sono molto sicuro che funzioni in ogni compilatore. C'è una domanda correlata , ma ancora senza risposta.
UPD:
In C ++ 11 puoi anche scrivere la NonAssignableclasse come segue:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
La deleteparola chiave impedisce ai membri di essere predefiniti, quindi non possono essere ulteriormente utilizzati nei membri predefiniti di una classe derivata. Tentare di assegnare genera il seguente errore in 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 ha già una classe solo per lo stesso scopo, immagino sia addirittura implementata in modo simile. La classe viene chiamata boost::noncopyableed è pensata per essere utilizzata come segue:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Ti consiglierei di attenermi alla soluzione di Boost se la tua politica di progetto lo consente. Vedi anche un'altra boost::noncopyabledomanda correlata per ulteriori informazioni.