Eu tenho uma aula:
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Como devo modificá-lo para desativar o código, como:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
e permita apenas códigos como:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Depurador humilde
fonte
fonte
Respostas:
Você pode tornar o construtor de cópias privado e não fornecer implementação:
Ou no C ++ 11, proíba-o explicitamente:
fonte
delete
palavra - chave, gostaria de adicionar o seguinte. Meu hábito de hábito atual ao projetar uma nova classe édelete
imediatamente ao construtor de cópias e ao operador de atribuição. Descobri que, dependendo do contexto, eles são na maior parte desnecessários e a exclusão deles evita alguns casos de comportamento inesperado. Se ocorrer uma situação em que um copiador possa ser necessário, determine se isso pode ser feito com a semântica de movimentação. Se isso for indesejável, forneça uma implementação para (!) O copiador de cópias e o operador de atribuição. Se essa é uma boa abordagem, deixarei para o leitor.Se você não se importa com a herança múltipla (afinal, não é tão ruim assim), você pode escrever uma classe simples com o construtor de cópia privada e o operador de atribuição e subclassificá-la adicionalmente:
Para o GCC, isso fornece a seguinte mensagem de erro:
Não tenho muita certeza de que isso funcione em todos os compiladores. Existe uma pergunta relacionada , mas sem resposta ainda.
UPD:
No C ++ 11, você também pode escrever a
NonAssignable
classe da seguinte maneira:A
delete
palavra-chave impede que os membros sejam construídos por padrão, portanto, eles não podem ser usados mais nos membros construídos por padrão de uma classe derivada. Tentar atribuir gera o seguinte erro no GCC:UPD:
O Boost já tem uma classe para o mesmo propósito, acho que é implementada de maneira semelhante. A classe é chamada
boost::noncopyable
e deve ser usada como a seguir:Eu recomendaria seguir a solução do Boost se a política do seu projeto permitir. Consulte também outra
boost::noncopyable
pergunta relacionada para obter mais informações.fonte
NonAssignable(const NonAssignable &other);
?delete
sintaxe da palavra-chave C ++ 11 .delete
eles, ele pára de funcionar (acabei de verificar).const Class&
eClass const&
são praticamente os mesmos. Para ponteiros, você pode ter umClass const * const
tipo par .Tornar
SymbolIndexer( const SymbolIndexer& )
privado. Se você está atribuindo a uma referência, não está copiando.fonte