[C++] problème avec une spécialisation de classe

problème avec une spécialisation de classe [C++] - C++ - Programmation

Marsh Posté le 21-03-2004 à 15:28:39    

Bon j'ai un problème, je crois que c'est une spécialisation de classe mais je ne suis pas sur.
 
j'ai une classe VAR et trois classes dérivées : Float,Int,Boolean
 
Bon, je pense que vous aurez compris à quoi elles servent. Je veux juste implémenter pour l'instant une méthode get, et une méthode set. j'ai fait un essai comme ça :
 

Code :
  1. class Var
  2. {
  3.     template <class T> void  setValue(T & val) {};
  4.    
  5.     template <class T> T getValue() {};
  6. };
  7. class Int : public Var
  8. {
  9.     public :
  10.    
  11.     Int (int val) :wValue(val) {}
  12.     void  setValue(const int & val) {wValue=val;};
  13.    
  14.     int  getValue() {return wValue;};
  15.    
  16.    
  17.     private :
  18.     int wValue;
  19. };


 
 
Si je fais ce code :
Int i;
i.setValue(3);
cout << i.getValue() << endl;
 
ça marche...
 
le problème c'est qu'en situtation réelle, les var sont stockées dans une pile... du coup quand je les récupère, il me fait une erreur : no matching function for call to `Var::getValue()'
 
ben ouais pask justement quand ça marche, il sait dans quelle classe on est, donc il appelle la bonne fonction, mais si c'est un var, il ne sait pas laquelle appeler
 
Alors, y'a moyen de résoudre ça ? ou alors je dois modéliser les classes autrement ? j'ai bien pensé à d'autres méthode genre renvoyer une union, mais ça ne fait vraiment pas très orienté objet ...
 
Help siouplait !


Message édité par fucky_fuck le 21-03-2004 à 15:50:57
Reply

Marsh Posté le 21-03-2004 à 15:28:39   

Reply

Marsh Posté le 21-03-2004 à 15:38:24    

Ca marchera jamais.

Reply

Marsh Posté le 21-03-2004 à 15:50:21    

verdoux a écrit :

Ca marchera jamais.


 
j'avais bien compris que ça allait être dur de faire marcher ça ... mais bon si quelqu'un a une idée sur une manière classique de faire ce genre de truc, ça pourrait aider !

Reply

Marsh Posté le 21-03-2004 à 19:25:13    

polymorphisme tout ca .....

Reply

Marsh Posté le 21-03-2004 à 19:36:53    

joel f a écrit :

polymorphisme tout ca .....


 
ok disons que je déclare getValue comme virtuelle et que j'oublie le template, je met quoi comme type de retour ? void * ? je fais une union avec 1 int,1 bool, 1 float, 1 char * ???
 
pask si je laisse le template, il va pas toujours chercher la bonne fonction, et j'ai aucun moyen de lui dire de le faire, puisque je ne peux pas déclarer ma fonction comme template de fonction et comme virtuelle pure ...
 
Je vois pas trop quelle serait la meilleure solution
 
help !

Reply

Marsh Posté le 21-03-2004 à 20:13:36    

Ben tu lui fait renvoyer un type Data* qui sera automatiquement
remplis correctement si tu surcharge tyes virtuelles par Int*,Char* etc ..

Reply

Marsh Posté le 21-03-2004 à 21:20:51    

joel f a écrit :

Ben tu lui fait renvoyer un type Data* qui sera automatiquement
remplis correctement si tu surcharge tes virtuelles par Int*,Char* etc ..


 
euh désolé, je suis un peu neuneu, mais je vois pas trop ce que tu veux dire ...
 
je fais un Data * genre
class Data  
{int ival;
 float fval;
...
}
 
je renvoie ça et la méthode appelante se débrouille pour prendre le bon champ ? c ça ?

Reply

Marsh Posté le 22-03-2004 à 10:34:36    

t as mal declaré ton template..
et la il sert a rien .
 
et ca sert a rien non plus  employer des mots savants qd on sais pas c'que ca veux dire

Code :
  1. template <class T>
  2. class Foo{
  3. Public:
  4. .... constructeur + destructeur virtuel ..
  5. T getValue() const{ return T;}
  6. void setValue(const T& t) { m_value = t;}
  7. private
  8. T m_value;
  9. }


 
FK


Message édité par frenchkiss le 22-03-2004 à 10:35:47
Reply

Marsh Posté le 22-03-2004 à 12:17:52    

Tu es gentil je sais ce que c'est qu'un template de classe, mais là ce que je veux c'est pouvoir mettre mes variables de type var * dans une liste... Or je ne pourrais pas en déclarant simplement un template, pask qu'il me dira que je dois spécifier le type que contient le template pour faire la liste...
 
Quand à la spécialisation, je ne parlais pas de spécialisation de template, mais bien de spécialisation de classe (à l'opposée d'une généralisation)... (enfin si je me rappelle bien mon lointain cours d'uml)
 
si je déclare Var comme ton Foo, comment je peux faire ça :
 

Code :
  1. Var<int> i;Var <float> f;
  2.     list<Var ???  *> li;
  3.  
  4.    
  5.     i.setValue(3);
  6.     f.setValue(3.2);
  7.    
  8.     li.push_back(&i);
  9.     li.push_back(&f);
  10.    
  11.     cout << li.size() << "\n";
  12.    
  13.     list::iterator i;
  14.     for (i=li.begin();i!=li.end();i++)
  15.         cout << (*i).getValue() << "\n" << std::flush;


 
y'a un moyen de lui faire accepter un var<de n'importe quel type> dans la liste ?


Message édité par fucky_fuck le 22-03-2004 à 12:18:23
Reply

Marsh Posté le 22-03-2004 à 12:26:23    

oui. faut faire une classe de bases aux Var puisque des classes templates n'ont aucun lien de parenté.

Reply

Marsh Posté le 22-03-2004 à 12:26:23   

Reply

Marsh Posté le 22-03-2004 à 12:29:23    

Taz a écrit :

oui. faut faire une classe de bases aux Var puisque des classes templates n'ont aucun lien de parenté.


 
ok, je vais essayer ! merci Taz et les autres aussi !!!
 
merde !  
avec
Var<int> i;Var <float> f;
    list<VarBase * > li;
il me met un `VarBase' is an inaccessible base of `Var<int>' ...
 
par contre j'ai pensé à un truc, quand je récupère le varBase, il faut que je fasse un cast vers une var pour pouvoir faire getValue, pask j'ai toujours pas de moyen de faire une méthode getValue dans VarBase ... ???


Message édité par fucky_fuck le 22-03-2004 à 12:36:20
Reply

Marsh Posté le 22-03-2004 à 12:34:08    

et on en profite pour parler de nos petits copains les boost::any
 

Code :
  1. #include <iostream>
  2. #include <list>
  3. #include <boost/any.hpp>
  4. namespace
  5. {
  6.   template <typename T>
  7.   inline void append(std::list< boost::any > &l, const T &v)
  8.   {
  9.     l.push_back(v);
  10.   }
  11. }
  12. int main()
  13. {
  14.   std::list< boost::any > l;
  15.   append(l, 3.14);
  16.   append(l, true);
  17.   append(l, std::list<int>());
  18. }

Reply

Marsh Posté le 22-03-2004 à 12:37:47    

ah je ne connaissais pas, mais effectivement c bo !


Message édité par fucky_fuck le 22-03-2004 à 12:38:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed