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
Rejoignez-nous