J'ai un cours :
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Comment dois-je le modifier pour désactiver le code comme:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
et n'autorisez que le code comme:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Humble débogueur
la source
la source
Réponses:
Vous pouvez rendre le constructeur de copie privé et ne fournir aucune implémentation:
Ou en C ++ 11, interdisez-le explicitement:
la source
delete
mot clé, j'aimerais ajouter ce qui suit. Mon habitude actuelle lors de la conception d'une nouvelle classe est dedelete
copier immédiatement le constructeur et l'opérateur d'affectation. J'ai constaté que, selon le contexte, ils sont pour la plupart inutiles et leur suppression évite certains cas de comportement inattendu. Si une situation se produit où un cteur de copie peut être nécessaire, déterminez si cela peut être fait avec la sémantique de déplacement. Si cela n'est pas souhaitable, fournissez une implémentation pour (!) Le cteur de copie et l'opérateur d'affectation. Je vais laisser au lecteur le soin de savoir si c'est une bonne approche.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:
Pour GCC, cela donne le message d'erreur suivant:
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: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: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: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.la source
NonAssignable(const NonAssignable &other);
?delete
syntaxe des mots clés C ++ 11 .delete
eux, ça arrête de fonctionner (je viens de vérifier).const Class&
etClass const&
sont à peu près les mêmes. Pour les pointeurs, vous pouvez mêmeClass const * const
taper.Rendre
SymbolIndexer( const SymbolIndexer& )
privé. Si vous attribuez une référence, vous ne copiez pas.la source