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.

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&){}
...
};
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
class SoundManager :public Singleton<SoundManager>
{
friend class Singleton<SoundManager>;
Très bien expliqué rien à demander.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
...
private:
 
SoundManager(const SoundManager&){}
SoundManager();
~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 :
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.
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
base class 'class QObject' should be explicitly initialized in the copy constructor.
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
A(const A &):QObject() {}.
(ici je vois l'intérêt d'ailleurs de n'avoir pas définit le constructeur de copie dans le template).

Si je commente par curiosité l'implémentation du constructeur de copie (et que je recompile tout ) j'ai une erreur de compilation :
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().
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 !

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...