C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Singleton : *Learn mode on*

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Geoffrey
Guest





PostPosted: Wed Oct 19, 2005 10:14 am    Post subject: Singleton : *Learn mode on* Reply with quote



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





PostPosted: Wed Oct 19, 2005 11:23 am    Post subject: Re: Singleton : *Learn mode on* Reply with quote



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





PostPosted: Wed Oct 19, 2005 2:19 pm    Post subject: Re: Singleton : *Learn mode on* Reply with quote




"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





PostPosted: Thu Oct 20, 2005 11:30 am    Post subject: Re: Singleton : *Learn mode on* Reply with quote

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
Wink)


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.