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 NonAssignable
classe come segue:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
La delete
parola 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::noncopyable
ed è 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::noncopyable
domanda correlata per ulteriori informazioni.