Si l'héritage multiple ne vous dérange pas (ce n'est pas si mal, après tout), vous pouvez écrire une classe simple avec un constructeur de copie privée et un opérateur d'affectation et la sous-classer en plus:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Pour GCC, cela donne le message d'erreur suivant:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Je ne suis pas sûr que cela fonctionne dans tous les compilateurs. Il y a une question connexe , mais sans réponse pour le moment.
UPD:
En C ++ 11, vous pouvez également écrire la NonAssignable
classe comme suit:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
Le delete
mot-clé empêche les membres d'être construits par défaut, ils ne peuvent donc pas être utilisés davantage dans les membres construits par défaut d'une classe dérivée. Essayer d'attribuer donne l'erreur suivante dans 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 a déjà une classe dans le même but, je suppose qu'elle est même implémentée de la même manière. La classe est appelée boost::noncopyable
et est destinée à être utilisée comme suit:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Je vous recommande de vous en tenir à la solution Boost si la politique de votre projet le permet. Voir également une autre boost::noncopyable
question connexe pour plus d'informations.