Bonjour,
J'ai récemment intégré le template singleton dans ce tutoriel.
J'ai une bonne compréhension globale de ce template mais je souhaitais confirmer l'analyse précise de son code.
L'opérateur de copie par affectation est interdit car il permettrait d'avoir deux objets. Donc on l'implémente 'private' dans la classe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <class T> class Singleton { ... private: T& operator= (const T&){} ... };
Très bien expliqué rien à demander.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 class SoundManager :public Singleton<SoundManager> { friend class Singleton<SoundManager>;
Même principe que plus haut : on interdit l'usage du constructeur de copie. Pourquoi ne pas l'avoir placé dans le template avec l'affectation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ... private: SoundManager(const SoundManager&){} SoundManager(); ~SoundManager(); };
Le constructeur/destructeur sont private pour des raisons évidentes et ne sont pas déclarés dans le template simplement pour avoir l'implémentation spécifique de la classe fille.
Code : Sélectionner tout - Visualiser dans une fenêtre à part T(const T&){}
De plus pour la destruction la variable étant statique elle sera détruite a la terminaison du processus.
Voilà pour cette partie.
Lorsque j'ai une classe A:public QObject, public singleton<A> { ...}
J'ai plusieurs choses à la compilation :
Le constructeur de copie de QObject étant privé je suis obligé d'ajouter dans la classe A :
Code : Sélectionner tout - Visualiser dans une fenêtre à part base class 'class QObject' should be explicitly initialized in the copy constructor.
(ici je vois l'intérêt d'ailleurs de n'avoir pas définit le constructeur de copie dans le template).
Code : Sélectionner tout - Visualiser dans une fenêtre à part A(const A &):QObject() {}.
Si je commente par curiosité l'implémentation du constructeur de copie (et que je recompile tout ) j'ai une erreur de compilation :
Le constructeur de copie n'étant pas définit le constructeur pas défaut est utilisé et donc celui des classe mères, soit QObject qui l'interdit. et bam !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 QObject::QObject(const QObject &) is private note : synthesized methode A::A(const A&) first required here : template <class T> T singleton<T>::m_i=T().
Mais du coup quand je définis le constructeur de copie qui fait {}, la référence est-elle bien passée dans le code du singleton (m_i=T()), ainsi que toute les données de QObject ?
Je suis confus...
Partager