Automate Singleton pb de linkage

Résolu
9sber
Messages postés
28
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
14 septembre 2004
- 27 juil. 2004 à 11:09
9sber
Messages postés
28
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
14 septembre 2004
- 28 juil. 2004 à 14:19
J'essai de construire un petit prog qui mets en oeuvre un automate de singleton comme suit.
Mais à la compilation j'ai des pbs de Linkage.

J'ai une classe mère pour mes singleton:

class Callmain;
//generic class for singleton
class CallState{
public:
virtual void action(Callmain*,QString);
protected:
void changeState(Callmain*,CallState*);
};

J'ai ensuite plusieurs singletons filles:

#include "CallState.h"
class CallReleased:public CallState{
protected:
CallReleased(){}
private:
static CallState* instance;
public:
friend class CallState;
static CallState* Instance(){
if(instance==NULL)
return instance=new CallReleased();
return instance;}
void action(Callmain*,QString);
};

et enfin, une classe qui dirige le tout:

#include "CallReleased.h"
class Callmain{
private:
friend class CallState;
void changeState(CallState*);
CallState* actualState;
public:
Callmain(){actualState=CallReleased::Instance();}
~Callmain();
void action(QString);
};

voilà pour le prog, maintenant, voici mon erreur:

Callmain.obj : error LNK2001: unresolved external symbol "private: static class CallState * CallReleased::instance" (?instance@CallReleased@@0PAVCallState@@A)

Je ne comprends pas très bien ce qu'il me reproche.

9Sber :kisses)

3 réponses

9sber
Messages postés
28
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
14 septembre 2004

28 juil. 2004 à 14:19
Je pense avoir résolu mon pb en ajoutant cette ligne dans le .cpp de mais différentes classes filles:

CallReleased * CallReleased ::instance=0;
...
3
essirc
Messages postés
48
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
26 juillet 2005
3
27 juil. 2004 à 12:05
Salut,

Il me semble que ton problème viens du fait que ton :
"friend class CallState;" est mal placé.

Tu devrais avoir :

#include "CallReleased.h"
class Callmain{
friend class CallState; // <--- Juste après l'accolade ouvrante
private:
void changeState(CallState*);
CallState* actualState;
public:
Callmain(){actualState=CallReleased::Instance();}
~Callmain();
void action(QString);
};
0
9sber
Messages postés
28
Date d'inscription
vendredi 30 avril 2004
Statut
Membre
Dernière intervention
14 septembre 2004

27 juil. 2004 à 13:11
merci pour la proposition, mais ca ne change rien.
D'ailleurs ca ne change rien non plus si on enlève cette ligne ainsi que celle du constructeur vide et du friend dans la classe CallReleased
0