Deshabilitar copia constructor

Tengo una clase :

class SymbolIndexer { protected: SymbolIndexer ( ) { } public: static inline SymbolIndexer & GetUniqueInstance ( ) { static SymbolIndexer uniqueinstance_ ; return uniqueinstance_ ; } }; 

¿Cómo debo modificarlo para desactivar el código como:

 SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( ); 

y solo permite código como:

 SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( ); 

Puede hacer que el constructor de copia sea privado y no proporcionar implementación:

 private: SymbolIndexer(const SymbolIndexer&); 

O en C ++ 11, explícitamente prohíbe:

 SymbolIndexer(const SymbolIndexer&) = delete; 

Si no te importa la herencia múltiple (no es tan malo, después de todo), puedes escribir una clase simple con el constructor de copia privada y el 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 cada comstackdor. Hay una pregunta relacionada , pero todavía no hay respuesta.

UPD:

En C ++ 11 también puede escribir la clase no NonAssignable la siguiente manera:

 class NonAssignable { public: NonAssignable(NonAssignable const&) = delete; NonAssignable& operator=(NonAssignable const&) = delete; NonAssignable() {} }; 

La palabra clave delete evita que los miembros se construyan por defecto, por lo que no se pueden utilizar más en los miembros creados 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 debe usarse como se muestra a continuación:

 #include  class SymbolIndexer: public Indexer, private boost::noncopyable { }; 

Recomiendo seguir con la solución de Boost si la política de tu proyecto lo permite. Consulte también otra pregunta relacionada con boost::noncopyable para obtener más información.

Haga que SymbolIndexer( const SymbolIndexer& ) privado. Si está asignando a una referencia, no está copiando.