Bonjour les gens !
Une fois de plus je reviens pour mon projet de gestion d'horaire..
Suite aux conseils, j'ai maintenant bien séparé tout mes objets : job, date, time et employer sont stockés dans des maps(ObjectContainer), réunis par leur iD pour chaque mission qui les utilises : mission[ 1 ]( int idJob, idDate, idTime, idEmployer )
Ils se composent tous de fonctions communes. ( Print(), operator <, operator ==)
J'ai une classe data qui réunie les objets instanciés.
J'ai tout d'abord rendu les membres de data publiques. Je devais donc faire un switch à chaque endroits où je les utilisaient.
J'ai alors essayé d'en faire appel directement dans data par un switch template et un enum, cependant, même si elle répondent de la même manière, je suis obligé de préciser le type dans chacune des parties ou je les utilises. ( <Name> ou <Date> ou ...)
En gros, je suis obligé de répéter ce switch à chaque fois.
Data.h
Object.h
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 #include <string> #include <vector> #include <map> #include "Object.h" class Data { public: Data() {} template < class T >//Mon getter qui me renvoie l'objet voulu. const T& Get( const char TYPE ) const {//Possibilité de lappeler grâce à son nom switch( TYPE ) {//Le type case JOB: return job;//Je dois préciser le type < Name > pour l'utiliser break; case DATE: return date;//Je dois préciser le type < Date > break; case TIME: return time;//... break; case EMPLOYER: return employer; break; } } std::vector< Mission > mission;//Vecteur de mission( const int job, date, time, employer ) private: Data( const Data& ) = delete; Data& operator= ( const Data& ) = delete; ObjectContainer< Name > job;//Cette classe template contient une map de noms correspondant aux jobs ObjectContainer< Date > date; ObjectContainer< Time > time; ObjectContainer< Name > employer; }; #endif // DATA_H_INCLUDED
Ce que j'aimerais obtenir :
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 #ifndef OBJECT_H_INCLUDED #define OBJECT_H_INCLUDED #include <iostream> #include <string> //========================================================== //ENUM TYPE //========================================================== enum { NOTHING, JOB, DATE, TIME, EMPLOYER, MISSION }; //========================================================== //ID GENERATOR Renvoi un Id toujours positif //========================================================== //... //========================================================== //CLASS Name //========================================================== //... //========================================================== //CLASS Date //========================================================== //... //========================================================== //CLASS Time //========================================================== //... //========================================================== //CLASS ObjectContainer //========================================================== template < class T > class ObjectContainer { public: ObjectContainer() {} void Print( const int objectId ) { table[ objectId ].Print(); }//Les objets référencés doivent contenir cette fonction const int Create( const T& t ) { int searchId( -1 ); typedef typename std::map< const int, T >::iterator TableIt; for( TableIt tableIt( table.begin()); tableIt != table.end(); tableIt++ ) { if( tableIt->second == t ) { searchId = tableIt->first; } } if( searchId == -1 ) { const int id( idGen.Create()); table[ id ] = t; searchId = id; } return searchId; } const T& Get( const int iD ) { return table[ iD ]; } private: std::map< const int, T > table; IdGenerator idGen;// }; //========================================================== //CLASS Mission //========================================================== class Mission { public: Mission( const char job, const char date, const char time, const char employer = NOTHING ) : job( job ), date( date ), time( time ), employer( employer ) { } const char Get( const int TYPE ) const { switch( TYPE ) { case NOTHING: return NOTHING; break; case JOB: return job; break; case DATE: return date; break; case TIME: return time; break; case EMPLOYER: return employer; break; } } private: char job; char date; char time; char employer; }; #endif // OBJECT_H_INCLUDED
N'y a t-il aucun autre moyen de faire, que passer par l'allocation dynamique et l’héritage pour solutionner ce problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void DataReader::Print( const int TYPE_1, const int TYPE_2, const int TYPE_3, const int TYPE_4, const Mission& mission ) const {//Afficher les éléments de la missions dans un ordre choisi en amont data.Get( TYPE_1 ).Print( mission.Get( TYPE_1 )); if( TYPE_2 != NOTHING ) data.Get( TYPE_2 ).Print( mission.Get( TYPE_2 )); if( TYPE_3 != NOTHING ) data.Get( TYPE_3 ).Print( mission.Get( TYPE_3 )); if( TYPE_4 != NOTHING ) data.Get( TYPE_4 ).Print( mission.Get( TYPE_4 )); }
PS(On m'a dit que l'héritage était mauvais pour définir des comportements, dans le cadre d'une factory, ce ne sont pas les comportements mais bien les objets qui y sont définis ?!? Son utilisation est donc tout à fait appropriée ?!)
Une fois de plus merci !
Partager