Bonjour à tous,
Voila j'ai (venant de Java/C#) voulu faire un objet qui soit accessible partout dans mon code.
Rien de plus logique pour moi donc de faire un header avec l'objet se terminant par:
static MonObjet MonInstanceObjet;
Si bien que partout dans le code je pourrais faire:
1 2 3
| #include "monobjet.h"
MonInstanceObjet.WriteCoucou(); |
Seulement j'ai découvert que le static en C++ provoque de très nombreuse instanciation. Je m'en suis rendu compte en affichant un petit texte de test avec le "cout" dans le constructeur.
J'ai donc tout logiquement cherché sur le net et de lien en lien j'en suis venu à trouver ce site: http://www.parashift.com/c++-faq-lit...html#faq-10.12 qui parle de "static initialization order fiasco".
J'ai donc mis mon static dans une fonction static:
1 2 3 4 5 6
| MonObjet& GetInstanceObjet()
{
static MonObjet* obj = new MonObjet();
return *obj;
}
#define MonInstanceObjet GetInstanceObjet() |
et cette fois c'est mieux...
Mais pas parfait, je suis encore étonné de trouver 3 instance faite (au lieu d'une vingtaine précédemment correspondant au nombre de fois où je l'utilise). Malheureusement ce n'est pas ce que je souhaite puisque je n'en veux qu'une !
Après de méticuleuse recherche, j'ai trouvé ce qui pourrait être la solution:
J'ai 3 projet qui l'utilise dans la solution. Mon premier projet dépend d'un second projet qui dépend lui-même d'un troisième (et l'objet se trouve dans le troisième).
J'en conclut donc que Visual compile projet par projet et offre une portée du static au projet uniquement.
D'où la question: comment faire pour que le static dans la méthode globable se propage au sein du code de la solution entière?
Lucyberad.
[EDIT: j'utilise VS2008 en projet non-managé]
Partager