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:
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;
} |