bonjour tout le monde,
J'ai un problème lors de l'édition de liens, qui me dit:
Partie.obj : error LNK2019: symbole externe non résolu "public: void __thiscall Observable<class Decors>::addObserver(class IObserver<class Decors> &)"
Bon je sais que cela signifie que la méthode n'est pas définie.
Mais pourtant elle l'est.
Je vous met le bout de code qui me génère cette erreur:
Je suppose que ma syntaxe n'est pas bonne mais je ne vois pas comment la corriger. Je vous mets les classes/templates que j'utilise. Si quelqu'un pouvait me dire ce qui ne va pas dans mon code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Vaisseau* vaisseau =new Vaisseau('-',5,40); Decors& leDecor=*new Decors(); leDecor.addObserver(*vaisseau);
L'idée est de notifier les observer qu'il y a eut du changement. Maintenant il faut savoir qui a lancé la notification, et c'est pourquoi je me suis tourné vers les templates pour mettre un type générique dans la méthode notificationEvent de l'Observer.
Voici le code de mon template Observable:
Et la classe Decors qui en hérite:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include "Observable.h" #include "IObserver.h" template<class T> void Observable<T>::notify(){ // Notifier tous les observers for (std::list<IObserver<T> *>::iterator=_observers.begin();it!=_observers.end();it++) { (*it)->notificationEvent(static_cast<T *>(this)); } } template<class T> void Observable<T>::addObserver(IObserver<T>& observer){ // Ajouter un observer a la liste _observers.push_back(&observer); } template<class T> void Observable<T>::removeObserver(IObserver<T>& observer){ //TODO faire find de observer }
Voici "l'interface" IObserver dont les observers doivent hériter:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Decors: public Observable<Decors>{ public: Decors(); ~Decors();
Et enfin la classe Vaisseau qui hérite de IObserver
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #ifndef IObserver_h #define IObserver_h template <class T> class IObserver{ public: IObserver() {} virtual ~IObserver() {} virtual void notificationEvent(T& donnees)= 0; }; #endif
Merci à ceux/celles qui pourront m'éclairer, ou m'expliquer comment faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Vaisseau:public AbstractVaisseau, public IObserver<Decors>{ public: Vaisseau(); virtual void notificationEvent(Decors& decor);
PS: bonne fêtes à tous
Partager