J'écris une bibliothèque de classes d'utilité, dont beaucoup sont des singletons. Je les ai implémentés en tant que tels en utilisant l'héritage:Instances Singleton multiples
template <class T>
class Singleton {
public:
T& getInstance() {
if(m_instance == 0) {
m_instance = new T;
}
return m_instance;
}
private:
static T* m_instance;
};
class SomeClass : public Singleton<SomeClass> {
public:
SomeClass() {}
virtual ~SomeClass() {}
void doSomething() {;}
};
Il s'agit évidemment d'un exemple simple, pas d'une classe réelle. Quoi qu'il en soit, je trouve que l'utilisation de code tel que:
SomeClass::getInstance().doSomething();
Permet de créer plus d'une instance de SomeClass. Je pense que cela peut être dû au fait qu'il est utilisé en dehors de mon fichier de bibliothèque (.a) ainsi qu'à l'interne. Par exemple, j'utilise une bibliothèque d'interface utilisateur non écrite par moi-même qui est compilée séparément et à laquelle je fais des ajouts. Certains de ces ajouts utilisent des singletons qui sont également utilisés dans ma bibliothèque.
La compilation séparée provoque-t-elle cela? Autre chose?
La seule façon que j'ai réussi à contourner le problème est de créer un objet global dans mon fichier main.cpp que j'INITIALISER des singletons je aurai besoin. Ensuite, tout le code accède cet objet global commun avec des appels tels que:
GlobalObject::getSomeClass().doSomething()
Je déteste avoir à ajouter une méthode supplémentaire pour cet objet chaque fois que je crée un autre singleton. De plus la syntaxe semble plus claire et plus familière en utilisant la première méthode d'accès:
SomeClass::getInstance().doSomething();
S'il vous plaît laissez-moi savoir si vous avez des pensées, des opinions, etc.
Merci.
Une grande discussion sur la façon de mettre en œuvre un singleton, avec fil de sécurité en C++ se trouve dans cet article: http://www.aristeia.com/Papers/DDJ%5FJul%5FAug%5F2004%5Frevised .pdf –