Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1463 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°679276
fucky_fuck
Posté le 21-03-2004 à 15:28:39  profilanswer
 

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
mood
Publicité
Posté le 21-03-2004 à 15:28:39  profilanswer
 

n°679280
verdoux
And I'm still waiting
Posté le 21-03-2004 à 15:38:24  profilanswer
 

Ca marchera jamais.

n°679287
fucky_fuck
Posté le 21-03-2004 à 15:50:21  profilanswer
 

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 !

n°679403
Joel F
Real men use unique_ptr
Posté le 21-03-2004 à 19:25:13  profilanswer
 

polymorphisme tout ca .....

n°679413
fucky_fuck
Posté le 21-03-2004 à 19:36:53  profilanswer
 

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 !

n°679429
Joel F
Real men use unique_ptr
Posté le 21-03-2004 à 20:13:36  profilanswer
 

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

n°679471
fucky_fuck
Posté le 21-03-2004 à 21:20:51  profilanswer
 

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 ?

n°679725
frenchkiss
Posté le 22-03-2004 à 10:34:36  profilanswer
 

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
n°679882
fucky_fuck
Posté le 22-03-2004 à 12:17:52  profilanswer
 

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
n°679884
Taz
bisounours-codeur
Posté le 22-03-2004 à 12:26:23  profilanswer
 

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

mood
Publicité
Posté le 22-03-2004 à 12:26:23  profilanswer
 

n°679890
fucky_fuck
Posté le 22-03-2004 à 12:29:23  profilanswer
 

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
n°679891
Taz
bisounours-codeur
Posté le 22-03-2004 à 12:34:08  profilanswer
 

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. }

n°679896
fucky_fuck
Posté le 22-03-2004 à 12:37:47  profilanswer
 

ah je ne connaissais pas, mais effectivement c bo !


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Problème de linkage avec dev cppproblème avec synchronized
probleme de creation de table associatif sous ms sql severProbleme Formulaire a envoyer par mail
probleme avec while ...Classe de connection a mysql
Probleme ! C insideProbleme de new, tableau, * , ou & ?
Probleme à l'affichage d'une requeteProbleme de table sous Power AMC! Help
Plus de sujets relatifs à : [C++] problème avec une spécialisation de classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR