Si no le importa la herencia múltiple (después de todo, no es tan malo), puede escribir una clase simple con un constructor de copia privada y un operador de asignación y, además, subclasificarla:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Para GCC esto da el siguiente mensaje de error:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
Sin embargo, no estoy muy seguro de que esto funcione en todos los compiladores. Hay una pregunta relacionada , pero aún sin respuesta.
UPD:
En C ++ 11 también puede escribir la NonAssignable
clase de la siguiente manera:
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
La delete
palabra clave evita que los miembros se construyan por defecto, por lo que no se pueden usar más en los miembros construidos por defecto de una clase derivada. Intentar asignar da el siguiente error en 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 ya tiene una clase solo para el mismo propósito, supongo que incluso se implementa de manera similar. La clase se llama boost::noncopyable
y está destinada a usarse como se indica a continuación:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
Recomiendo apegarse a la solución de Boost si la política de su proyecto lo permite. Consulte también otra boost::noncopyable
pregunta relacionada para obtener más información.