Tengo una clase :
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
¿Cómo debo modificarlo para deshabilitar código como:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
y solo permite códigos como:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Humilde depurador
fuente
fuente
Respuestas:
Puede hacer que el constructor de copia sea privado y no proporcionar implementación:
O en C ++ 11, prohíba explícitamente:
fuente
delete
palabra clave, me gustaría agregar lo siguiente. Mi hábito actual al diseñar una nueva clase es paradelete
el constructor de copias y el operador de asignación de inmediato. Descubrí que, según el contexto, son en su mayoría innecesarios y eliminarlos evita algunos casos de comportamiento inesperado. Si se produce una situación en la que puede ser necesario un copiador, determine si se puede hacer con la semántica de movimiento. Si esto no es deseable, proporcione una implementación para ambos (!) El copiador y el operador de asignación. Si este es un buen enfoque, lo dejaré en manos del lector.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:
Para GCC esto da el siguiente mensaje de error:
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: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: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: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.fuente
NonAssignable(const NonAssignable &other);
?delete
sintaxis de palabras clave de C ++ 11 .delete
, deja de funcionar (lo acabo de comprobar).const Class&
yClass const&
son bastante iguales. Para los punteros, puede tener incluso elClass const * const
tipo.Hacer
SymbolIndexer( const SymbolIndexer& )
privado Si está asignando a una referencia, no está copiando.fuente