Je veut avoir une liste d'elements differents, par exemple de string bool et int.
J'ai donc ma classe GenericValue, utilisant polymorphisme (pour etre manipule comme simplement "Generic" ), et template pour eviter d'ecrire une classe fille par type que je mets dedans.
Code :
- class Generic
- {
- public:
- virtual ~Generic(){};
- virtual const type_info& getType() =0;
- };
- template<class T>
- class GenericValue : public Generic
- {
- public:
- GenericValue() {
- _value = NULL;
- };
- GenericValue(T * val) {
- _value = val;
- };
- virtual ~GenericValue() {
- if (_value != NULL)
- delete _value;
- };
- virtual const type_info& getType() { return typeid(*this); };
- T * get() {
- return _value;
- };
- T * getValue() {
- return _value;
- };
- private:
- T * _value;
- };
|
Donc l'idee est que je mets mes elements dans un vector disont.
Code :
- vector<Generic*> vec(4,NULL);
- vec[0] = new GenericValue<string>(new string("hfr" ));
- vec[1] = new GenericValue<int>(new int(22));
- //super, j'ai mes chien et chats dans la meme boite
- GenericValue<string>* val1 = dynamic_cast<GenericValue<string>*>(vec[0]);
- // et je retrouve ma valeur sans probleme
|
Donc comme ca, ca marches.
Mais, si je veux mettre l'object lui meme dans mon vector et non un pointeur plus possible:
Code :
- vector<Generic> vec(4);
- vec[0] = GenericValue<string>(new string("hfr" ));
|
Compile pas, car il veut instancier Generic qui est virtuel pure, pour remplir le vector de valeur par defaut.
Seulement je veux que le destructeur de GenericValue<T> soit appele lors de la destruction d'un Generic, donc il me faut ce virtual pure.
Suis-je oblige du coup d'utiliser que des pointeurs sur Generic et jamais directement de reference?
Ou dois-je par exemple agrandir d'un mon vector pour y ajouter directement une instance de GenericValue<T> ? (mais dans ce cas il me semble que quand je redimm le vector d'un il cherche quand meme a creer une instance defaut de Generic)
---------------
Habillé par Canon, Gallerie web v1.0