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
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 28
    Points
    28
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 28
    Points
    28
    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 du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 47
    Points
    47
    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 du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    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
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 28
    Points
    28
    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