probleme de cast dynamique avec heritage etc

probleme de cast dynamique avec heritage etc - C++ - Programmation

Marsh Posté le 02-12-2002 à 00:19:28    

J'essaye de faire un sujet d'exam, et je me retrouve keblo.
Donc les class vrai,faux et non sont des formules. c ça le sujet j'y peut rien  :D .
le prob ce trouve quand je veux surcharger l'operateur cout << avec les class.
 

Citation :


main(){
formule* f=new vrai;
cout << *f;
}


 
ca ca marche.
par contre je vois pas comment je peux m'en sortir pour faire ça :
 

Citation :

main(){
formule* f=new non(new vrai);
cout << *f;}


 
En effet, lorsque j'appelle l'operator << surchargé pour le non, et bien je doit ensuite relancer sur une formule qui est pointée par le champ non::A , sauf que le compilateur veut utilisé l'operateur surchargé de formule. le prob c'est que ça marche pas  :(  :D  
une autre idée aurait été de mettre la fonction operator<< de la class formule en virtual, mais ça marche pas.
 
 
En fait il retrouve pas automatiquement le type inferieur.
a mon avis personne va capter  :whistle:  
 

Citation :

#include<iostream.h>
 
class formule
{  
};
 
class vrai : public virtual formule
{
  public:
  vrai;
  friend ostream& operator<<(ostream &os,vrai &ob){return os << "vrai" ; };
 
};
 
class faux : public virtual formule
{
public:
  faux;
  friend ostream& operator<<(ostream &os,faux &ob){return os << "faux" ; };
   
};
 
class non : public formule
{
  formule* A;
public:
  non(formule* X):A(X){};
  friend ostream& operator<<(ostream &os,non &ob){return os << "non(" << *ob.A <<" )"; };
};


Message édité par karim63 le 02-12-2002 à 00:30:29
Reply

Marsh Posté le 02-12-2002 à 00:19:28   

Reply

Marsh Posté le 02-12-2002 à 21:40:13    

Deja il sert a quoi le virtual dans

Code :
  1. class vrai : public virtual formule


? Tu fais pas de l'héritage multiple ?
 
Déja, il me semble que si tu veux surcharger l'opérateur << et un ostream, il faut que tu le fasse dans une fonction externe (d'ou ton friend). Qui dit externe à la classe exclue l'utilisation d'une méthode virtual. Or toi tu as besoin d'un comportement "virtual".
 
La solution est de:
- faire une fonction virtual "Print" dans ta classe de base (que tu réimplémentera dans les classes filles)
- faire une fonction "ostream& operator<<(ostream &o, formule &f)" qui va appeler "f.Print(o);"
 
Et si tu mets "Print" public, tu peux virer le "friend"


Message édité par kenshiro182 le 02-12-2002 à 21:41:17
Reply

Marsh Posté le 02-12-2002 à 22:31:31    

A tient j'avais pas vu qu'on pouvai quoter en c++ c chouette  :)  
Sinon des potes de facs m'ont donné la solution, c'est effectivement ce que tu preconise bravo  :D  
 
Ce mangnifique bout de code est compilable.  :whistle:  
Il faut que je rajoute maintenant la transformation de A implique
B en non A ou B
 
 

Code :
  1. #include<iostream.h>
  2. class formule
  3. {
  4. protected:
  5.   bool val;
  6. public:
  7.   virtual ostream& display(ostream &)=0; 
  8.   virtual bool eval()=0;
  9. };
  10. ostream& operator<<(ostream& os,formule &f)
  11. {
  12.   return f.display(os);
  13. };
  14. class vrai : public formule
  15. {
  16.   public:
  17.   vrai;
  18.   ostream& display(ostream &os){return os << "vrai";};
  19.   bool eval(){val=true;return val;};
  20. };
  21. class faux : public formule
  22. {
  23. public:
  24.   faux;
  25.   ostream& display(ostream &os){return os << "faux";};
  26.   bool eval(){val=false;return val;};
  27. };
  28. class non : public formule
  29. {
  30.   formule* A;
  31. public:
  32.   non(formule* X):A(X){};
  33.   ostream& display(ostream &os){return os << "non("<< *A <<" )";};
  34.   bool eval(){val= !( A->eval()) ;return val;};
  35. };
  36. class ou : public formule
  37. {
  38.   formule* A;
  39.   formule* B;
  40. public:
  41.   ou(formule* X,formule* Y):A(X),B(Y){};
  42.   ostream& display(ostream &os){return os << "ou("<<*A<<","<<*B<<" )";};
  43.   bool eval(){val=( A->eval() ) || ( B->eval() );return val;};
  44.  
  45. };
  46. class et : public formule
  47. {
  48.   formule* A;
  49.   formule* B;
  50. public:
  51.   et(formule* X,formule* Y):A(X),B(Y){};
  52.   ostream& display(ostream &os){return os << "et("<<*A<<","<<*B<<" )";};
  53.   bool eval(){val=( A->eval() ) && ( B->eval() );return val;};
  54.  
  55. };
  56. class implique : public formule
  57. {
  58.   formule* A;
  59.   formule* B;
  60. public:
  61.   implique(formule* X,formule* Y):A(X),B(Y){};
  62.   ostream& display(ostream &os){return os << "=>("<<*A<<","<<*B<<" )";};
  63.   bool eval(){val=(!( A->eval() )) || ( B->eval() );return val;};
  64. };
  65. class variable : public formule
  66. {
  67.   char* nom;
  68. public:
  69.   variable(char* _nom,bool _val):nom(_nom){val=_val;};
  70.   ostream& display(ostream &os){return os << nom;};
  71.   bool eval(){return val;};
  72. };
  73. main()
  74. {
  75.   formule* f = new ou( new non(new vrai),new et(new vrai,new implique(new faux, new variable("v",true))));
  76.   formule* g = new non(new vrai);
  77.   cout << *f<< " s'evalue en "<< f->eval() << endl;
  78.   cout << *g<< " s'evalue en "<< g->eval() << endl;
  79. };

Reply

Marsh Posté le 02-12-2002 à 22:33:15    

kenshiro182 a écrit a écrit :

Deja il sert a quoi le virtual dans

Code :
  1. class vrai : public virtual formule


? Tu fais pas de l'héritage multiple ?




 
Effectivement non il sert a rien ici.  :whistle:

Reply

Marsh Posté le 03-12-2002 à 03:07:26    

Citation :

Code :
  1. class vrai : public formule
  2. {
  3. public:
  4. vrai;


Ça m'étonnerai beaucoup que ça compiles ça.
Il faut impérativement des () pour un constructeur, sinon c'est un type seul illégal.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 03-12-2002 à 03:11:10    

Musaran a écrit a écrit :

Citation :

Code :
  1. class vrai : public formule
  2. {
  3. public:
  4. vrai;


Ça m'étonnerai beaucoup que ça compiles ça.
Il faut impérativement des () pour un constructeur, sinon c'est un type seul illégal.



je confirme ;)


---------------
Fervent admirateur de l'Empereur Palpatine. Pour un pouvoir fort et le règne de l'Ordre.
Reply

Marsh Posté le 03-12-2002 à 10:31:54    

bah si ça marche :D
mais j'ai rajouté vrai(){}; après.

Reply

Sujets relatifs:

Leave a Replay

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