Bonjour,
Je bute sur une question dont je ne sais comment trouver la solution... Je veux créer des objets en fonction d'un mot clef dans un fichier de mise en données, et je me dis qu'a priori la bonne façon de faire serait d'utiliser une factory, mais ces objets sont des instances de classes templates et du coup je ne sais pas comment les déclarer auprès de la factory... Pour les classes ordinaire, j'utilise une macro, qui ressemble à ceci :
et qui est invoquée dans les fichiers d'implémentation des classes concernées (.C, pour nous).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define DECLARE_CRYSTALLO(CLASS_NAME,KEYWORD) \ namespace { \ Crystallo* creator(){ return new (CLASS_NAME);} \ const string kwords(KEYWORD); \ const bool registered = Factory<Crystallo>::Instance().Register(kwords,creator); \ }
Mais pour des classes templates, je n'ai plus de fichier d'implémentation, du coup je ne sais pas trop où je peux invoquer cette macro en ce qui les concerne...
Pour le moment, le travail est fait ainsi:
Ce que je préfèrerais nettement remplacer par un appel à une O.F. ... Est-ce que je devrais créer un fichier bidon à compiler qui ne contiendrait que des appels à la macro qui va bien pour déclarer ces classes auprès de la factory ? Ou y a-t-ilune arnaque que je ne comprends pas ?
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 if((*gr)->GetLineType() == "line") _graphs[(*gr)->GetTag()]=new CommandGraph<Line>(*this, (*gr)->GetTag(), graphbox, graphmin, graphmax, egrid); else if((*gr)->GetLineType() == "faultedline") _graphs[(*gr)->GetTag()]=new CommandGraph<FaultedLine>(*this, (*gr)->GetTag(), graphbox, graphmin, graphmax, egrid);
Merci tout plein !!! :-)
Marc
Partager