 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Geoffrey Guest
|
Posted: Wed Oct 19, 2005 10:14 am Post subject: Singleton : *Learn mode on* |
|
|
Bonjour a tous,
voila j'aimerai une petite explication sur le probleme suivant.
j'ai une dll DLLA qui a un object SingletonA
ce singleton est donc créé au cours de l'execution de A par l'appel a une
methode statique
si la DLLA charge une DLLB, et que dans la DLLB j'appelle mon singleton dans
A -> SingletonA::Instance()
le comportement n'est pas celui que j'attendais.
Et la c'est un peu brouillon dans mon esprit ...
En fait, la methode statique executé dans le contexte DLLB ne connait pas
l'instance créé dans DLLA et rapelle donc le constructeur de SingletonA (
effectivement ca parait logique ) mais ce constructeur est quand a lui
executé dans le contexte de A ( pourquoi ? ) ou l'instance existe deja.
Quand a moi je voudrais etre capable d'appeler l'instance de cette classe
SingletonA definie dans DLLA depuis DLLB ?? Est ce que c'est possible, et ou
est ce que je me trompe ?
Merci de vos reponses.
Si besoin je vais essayer d'illustrer ceci avec du code ...
la class Singleton est de ce type :
template< typename T> class Singleton
{
protected:
static T* mSingleton;
public:
Singleton()
{
assert( mSingleton == NULL ) // Heureusement que j'ai cette
assertion pour me rendre compte du probleme !
}
~Singleton()
{
mSingleton = NULL;
}
static T& Instance()
{
if ( mSingleton == NULL )
mSingleton = new T;
assert( mSingleton != NULL );
return (*mSingleton);
}
static void Destroy()
{
if ( mSingleton != NULL )
{
delete mSingleton;
mSingleton = NULL;
}
}
};
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Oct 19, 2005 11:23 am Post subject: Re: Singleton : *Learn mode on* |
|
|
On Wed, 19 Oct 2005 12:14:25 +0200, "Geoffrey" <gbaudin2 (AT) wanadoo (DOT) fr>:
| Quote: | j'ai une dll DLLA qui a un object SingletonA
ce singleton est donc créé au cours de l'execution de A par l'appel a une
methode statique
si la DLLA charge une DLLB, et que dans la DLLB j'appelle mon singleton dans
A -> SingletonA::Instance()
static T* mSingleton;
|
Ceci est une déclaration de variable (membre).
Normalement, tu dois avoir la définition qui va avec, dans un .cpp et
un seul. Typiquement :
static T* Singleton::mSingleton= NULL;
Seulement voilà, ta classe est une classe template, du coup la
définition en question se trouve sans doute dans un .h. Le linker s'en
tire sans ajout de paracétamol quand tu te contentes d'un exécutable,
mais dans le cas qui nous préoccupe, tu en as trois (un .exe et deux
..dll, qui sont en fait, à peu de chose près, des .exe).
Honnêtement, je ne pense pas être capable de comprendre la mécanique
interne de ce machin. Par contre, je peux te proposer une solution :
dé-templatiser le singleton, et mettre le pointeur dans un .cpp.
Ainsi, tu sauras exactement quelle DLL a le pointeur.
// machin.h
class Machin // un singleton
{
public:
friend Machin* GetInstanceMachin();
private:
Machin();
Machin (Machin const&);
void operator= (Machin);
};
// machin.cpp
static Machin* ptr_instance_Machin= 0;
Machin* GetInstanceMachin()
{
if (ptr_instance_Machin == 0)
{
ptr_instance_Machin= new Machin;
}
return ptr_instance_Machin;
}
Oui, je sais, c'est pas très idiomatique, mais c'est plus encapsulé,
et ça permet de s'y retrouver plus facilement quand, comme moi, on n'a
pas les idées claires sur le sujet : une DLL (et une seule) contient
le pointeur Machin*, et cette DLL exporte la fonction
GetInstanceMachin(). C'est clair, net et précis.
|
|
| Back to top |
|
 |
Geoffrey Guest
|
Posted: Wed Oct 19, 2005 2:19 pm Post subject: Re: Singleton : *Learn mode on* |
|
|
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de news:
[email]lt9cl11egrtjo8gjas27djobhed6ak6av9 (AT) 4ax (DOT) com[/email]...
| Quote: | On Wed, 19 Oct 2005 12:14:25 +0200, "Geoffrey" <gbaudin2 (AT) wanadoo (DOT) fr>:
j'ai une dll DLLA qui a un object SingletonA
ce singleton est donc créé au cours de l'execution de A par l'appel a une
methode statique
si la DLLA charge une DLLB, et que dans la DLLB j'appelle mon singleton
dans
A -> SingletonA::Instance()
static T* mSingleton;
Ceci est une déclaration de variable (membre).
Normalement, tu dois avoir la définition qui va avec, dans un .cpp et
un seul. Typiquement :
static T* Singleton::mSingleton= NULL;
|
oui excuse moi dans ma classe Singleton a la suite j'ai bien
l'initialisation du membre static mSingleton a NULL comme suis :
template <class T> T* Singleton<T>::mSingleton = NULL;
tout ca se trouve en effet dans le fichier en-tête
| Quote: | Seulement voilà, ta classe est une classe template, du coup la
définition en question se trouve sans doute dans un .h. Le linker s'en
tire sans ajout de paracétamol quand tu te contentes d'un exécutable,
mais dans le cas qui nous préoccupe, tu en as trois (un .exe et deux
.dll, qui sont en fait, à peu de chose près, des .exe).
Honnêtement, je ne pense pas être capable de comprendre la mécanique
interne de ce machin. Par contre, je peux te proposer une solution :
dé-templatiser le singleton, et mettre le pointeur dans un .cpp.
Ainsi, tu sauras exactement quelle DLL a le pointeur.
// machin.h
class Machin // un singleton
{
public:
friend Machin* GetInstanceMachin();
private:
Machin();
Machin (Machin const&);
void operator= (Machin);
};
// machin.cpp
static Machin* ptr_instance_Machin= 0;
Machin* GetInstanceMachin()
{
if (ptr_instance_Machin == 0)
{
ptr_instance_Machin= new Machin;
}
return ptr_instance_Machin;
}
Oui, je sais, c'est pas très idiomatique, mais c'est plus encapsulé,
et ça permet de s'y retrouver plus facilement quand, comme moi, on n'a
pas les idées claires sur le sujet : une DLL (et une seule) contient
le pointeur Machin*, et cette DLL exporte la fonction
GetInstanceMachin(). C'est clair, net et précis.
|
En fait, j'ai oublié cette infos,
ma DLLA qui contient donc ma classe declare comme suis "class
__declspec(dllexport) SingletonA : public Singleton<SingletonA>"
la classe est donc exportée ??
dites moi si j'ai bien compris ( desolé, j'espere que ce que j'ecris ne va
pas etre trop confus )
ma DLLB quand a elle est liée a DLLA.lib et inclus le fichier SingletonA.h
=> je peux donc utiliser l'objet SingletonA definie dans DLLA a partir de
DLLB ??
maintenant quand est il des membres statiques de SingletonA ??? Sont ils
egalement exportés ??
Est ce que ca peut etre un probleme d'exportation des membres statiques ?
|
|
| Back to top |
|
 |
Geoffrey Guest
|
Posted: Thu Oct 20, 2005 11:30 am Post subject: Re: Singleton : *Learn mode on* |
|
|
autant pour moi, je devrai me coucher plus tot egalement ...
j'ai juste deconné avec mes symboles d'export/import ...
C'est la faute au copié/collé, je suis derangé, et j'oublie de modifier !
desolé du derangement
)
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|