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

C++ Discussion :

impl�mentation design pattern ( Abstract factory ) [ probl�me Linker ]


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par d�faut impl�mentation design pattern ( Abstract factory ) [ probl�me Linker ]
    Bonjour,

    je suis actuellement en train d'impl�menter une abstract factory un peu particuliere qui aura pour but de parser des donn�es entrantes, obtenir un identifiant de cet �tape de parse, chercher dans un std::map (static) la factory attach� � cette id�ntifiant et de cr�er un objet.
    La petite difficult� suppl�mentaire est de faire en sorte que chaque factory puisse faire un callback sur l'objet appellant le parser.

    Maintenant que le d�cor est � peu pr�s plant� voici mon soucis, mon code est valide et se compile mais je tombe sur une erreur de link dans laquelle il m'indique que mon std::map n'est pas d�fini.

    Je ne sais pas si la pr�sentation du probl�me est tr�s claire ( pas facile � expliquer en fait ) mais voici le code source du principe que j'aimerai mettre en place ( c'est une version tr�s light de mon autre impl�mentation mais surement plus lisible ) merci � ceux qui se pencheront dessus.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #include <iostream>
    #include <map>
    using namespace std;
     
     
     
    class C_impl
    {
    public :
        C_impl()
        { }
        ~C_impl()
        { }
    };
     
    template<class T>
    class A
    {
     
    public :
     
        static void parse(T& u, uint16_t id)
        {
     
            iter it = m_factories.find(id);
            if (it == m_factories.end())
                return;
     
            (*it).second->create(u);
     
        }
     
     
        class factory
        {
     
        public :
            virtual void create(T& u) = 0;
     
        protected :
            factory(uint16_t id)
            {
     
                A::m_factories.insert(std::make_pair(id, this));
            }
     
            virtual ~factory()
            { }
     
        };
    private :
        A()
        { }
        ~A()
        { }
        typedef typename std::map<uint16_t,factory*>::iterator iter;
        static std::map<uint16_t, factory*> m_factories;
     
     
    };
     
     
    template<class T>
    class C_factory : public A<T>::factory
    {
     
    public :
        C_factory() : A<T>::factory(0x0001)
        { }
     
        virtual void create(T& u)
        {
            u.on_event(C_impl());
        }
    };
     
    class user
    {
     
    public :
     
        user()
        { }
        ~user()
        { }
     
     
    private :
        void on_event(const C_impl& c)
        {}
     
        friend class C_factory<user>;
    };
     
     
    int main()
    {
     static C_factory<user> c_f;
     
     return 0;
     
    }

  2. #2
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    je tombe sur une erreur de link dans laquelle il m'indique que mon std::map n'est pas d�fini.
    Il a raison :
    http://c.developpez.com/faq/cpp/?pag..._static_erreur

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par d�faut
    Merci pour cette r�ponse rapide je m'en veux de ne pas y avoir pens� :/
    Ce que je ne comprend pas c'est que �a ne me r�gle pas cette erreur de linker

    Undefined symbols : A<user>::m_factories
    Pourtant j'ai bien ajout� � mon code la d�finition du membre static:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    template<>
    std::map< uint16_t, A<user>::factory* > A<user>::m_factories;

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par d�faut
    A tout hasard, as-tu initialis� tes variables statiques?
    Il faut comprendre qu'une variable statique n'est finalement qu'une variable globale "d�guis�e", il faut donc l'initialiser pour que le compilateur sache qu'en faire. Il me semble que g�n�ralement, on l'initialise en d�but du .cpp correspondant.

  5. #5
    Membre �clair�
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    D�tails du profil
    Informations personnelles :
    �ge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Par d�faut
    les membres statiques des classes template, c'est la mis�re. je remplacerais:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    static std::map<uint16_t, factory*> m_factories;
    par une m�thode statique:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    static std::map<uint16_t, factory*> &GetFactories()
    {
    	static std::map<uint16_t, factory*> factories;
    	return(factories);
    }
    �a t'�vitera de te prendre la t�te

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    26
    D�tails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Par d�faut
    Moi qui allais �dit� tout fier pour mettre la m�thode qui fonctionne ...

    Donc oui la solution c'est bien de mettre un getter static � utiliser � chaque fois qu'on a besoin de la map.

    Merci de vos r�ponses si rapides.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [ZF 1.11] Impl�mentation design pattern data mapper
    Par Kunai dans le forum MVC
    R�ponses: 6
    Dernier message: 22/02/2012, 17h37
  2. Impl�menter le design pattern Factory
    Par Danger dans le forum Logging
    R�ponses: 4
    Dernier message: 27/03/2010, 10h01
  3. Impl�mentation du pattern Factory
    Par tut dans le forum C++
    R�ponses: 6
    Dernier message: 02/08/2006, 13h43
  4. R�ponses: 2
    Dernier message: 01/06/2006, 14h36
  5. [Fabrique] [Java] Design Pattern Factory
    Par SkyBioSS dans le forum Design Patterns
    R�ponses: 3
    Dernier message: 24/05/2006, 14h53

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