J'ai demandé à un Question À propos de Singleton Mise en œuvre Il y a quelques minutes, j'ai une très bonne réponse de @LighessRacesinorbit.
Mais je ne peux pas comprendre pourquoi dans l'exemple suivant si j'instaine sortie: p> Pour être plus correct, je comprends ou il n'était pas em> détruit? Pourquoi? P> p> singleton code> dans variable
inst code> son destructeur appelé deux fois? p>
4 Réponses :
Cette ligne doit être p> Singleton(Singleton const&) = delete; // Copy construct
Singleton(Singleton&&) = delete; // Move construct
Singleton& operator=(Singleton const&) = delete; // Copy assign
Singleton& operator=(Singleton &&) = delete; // Move assign
Ouais. Si vous voulez vraiment qu'un singleton soit un singleton, vous devrez supprimer son constructeur de copie ou le faire privé.
Il n'est pas nécessaire de supprimer explicitement les versions de référence RValue, car le compilateur ne les générera pas automatiquement.
Il n'y a pas besoin i> pour beaucoup de choses
La ligne
void operator=( const Singleton& ) = delete;
@ πννταῥεῖ en théorie, vous avez raison, mais pour un singleton, il ne devrait pas exister d'une seconde instance à céder à;) Mais oui, il est possible de finir avec un code stupide qui déclenche accidentellement la mission, je modifierai le réponse.
@DanielEfrey, je suppose que l'on peut faire singleton :: getinstance () = singleton :: getinstance (); code>, qui est vraiment hors limites, mais toujours faisable;)
@Vsoftco Oui, mais ce n'est plus un accident, il demande des ennuis. :-RÉ
Si cela peut être fait, on finit par le faire: D Mais je suis totalement d'accord, cela demande des ennuis.
@vsoftco C'est pourquoi je envisage d'être légèrement paranoïaque à être un atout pour un développeur de logiciels :-p
Essayez d'ajouter un copy-constructeur public: Votre sortie deviendra: p> Il y a deux "singletons" vivants parce que celui de getinstance () code> a été copié. Pour éviter de copier par inadvertance singletons, vous devez supprimer le constructeur de copie et les opérateurs d'affectation: p>
Il y a quelque chose de satisfaire de voir la production de débogage que j'ai choisi arbitrairement se frayer un chemin à travers deux personnes à un autre post :)
Cela semble tellement heureux aussi!
Vous pouvez cacher le singleton dans une classe normale ne présentant pas sa nature statique:
Ajouter
singleton (singleton const &) {std :: cout << "Copier la construction! \ N"; } code> à votre exemple et tout sera révélé.
Vous devriez rendre la classe non copiable et non mobile:
singleton (singleton const &) = Supprimer; Singleton (singleton &&) = Supprimer; Singleton & opérateur = (singleton const &) = Supprimer; Opérateur Singleton = (singleton &&) = Supprimer; code>
Vous avez Deux B> Instances de
Singleton Code> Tapez votre programme. One est
statique code> intérieure
getinstance code>. Un autre est local intérieur
principal code>. Chaque objet est détruit éventuellement. D'où deux appels destructeurs. Pourquoi est-ce que cela vous surprend que le destructeur est appelé deux fois?
@Ant parce que je suis débutant. Merci à tous. Maintenant, je comprends.
Je recommande de lire ceci: JALF.DK/BLOG/2010/03/...
Désolé, j'aurais dû supprimer le constructeur de copie et l'opérateur d'affectation. Bien que dans un sens, je suis content que je ne l'ai pas fait parce que tu dois demander ceci :)
@LightnessRacesinorbit et après avoir obtenu l'écriture à l'aise et utiliser Singleton, ils peuvent procéder à Apprentissage à éviter d'utiliser :)