IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Problème de template sur Design pattern Observer - Observable


Sujet :

Langage C++

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Problème de template sur Design pattern Observer - Observable
    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:
    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);
    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.

    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:
    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
    }
    Et la classe Decors qui en hérite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Decors: public Observable<Decors>{
    public:
     
    	Decors();
    	~Decors();
    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
    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
    Et enfin la classe Vaisseau qui hérite de IObserver
    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);
    Merci à ceux/celles qui pourront m'éclairer, ou m'expliquer comment faire.

    PS: bonne fêtes à tous

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    tes methodes templates sont définies dans un ,hpp et pas dans un .cpp hein ?

  3. #3
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Pffff, quel boulet que je suis. Effectivement les méthodes template doivent être définies dans le .h et pas dans le .cpp

    Quel gros nul

    Je viens de relire mon cours, et j'avais annoté "Uniquement dans le .h" dans la marge.

    Bref sujet clos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Template de Design Pattern
    Par youkoun dans le forum BOUML
    Réponses: 10
    Dernier message: 05/05/2008, 16h54
  2. Design Pattern Observer
    Par BoBy9 dans le forum Logging
    Réponses: 1
    Dernier message: 18/11/2007, 19h16
  3. Design pattern Observer
    Par aicfr dans le forum Logging
    Réponses: 1
    Dernier message: 06/11/2007, 23h14
  4. [Conception] Design Pattern Observer Java
    Par jeb001 dans le forum Général Java
    Réponses: 4
    Dernier message: 02/05/2007, 23h43
  5. [Observateur] Précisions sur le design pattern Observer [UML]
    Par joquetino dans le forum Design Patterns
    Réponses: 2
    Dernier message: 07/10/2004, 22h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo