[C++] expression infixée -> postfixée

expression infixée -> postfixée [C++] - C++ - Programmation

Marsh Posté le 29-10-2004 à 20:56:16    

j'ai une expression, représenté par une file de symbole nommé rep (pour représentation)
 
dans ma classe expression, j'ai une méthode infVersPost, qui doit me retourner une expression, mais en postfixé (2 + 2 devient 2 2 +)
 
le traitement fonctionne plutot bien, je l'avais testé en déclarant la fonction en void et en remplacant l'expression appelante par celle postfixé
 
mais là j'en arrache pour retourner une expression, en gros je me fis sur un courriel du prof
 
 
"On peut alors créer dans la fonction la version postfixée et la retourner par valeur. Évidemment, il faudra faire un copieur d'expression. Il n'y a pas lieu de faire un copieur de file, car une file est un conteneur, mais c'est très bien de faire un copieur  d'expression, car une expression est un scalaire!"
 

Code :
  1. Expression Expression::infVersPost()const{
  2.   Expression inf,post;
  3.   inf=*this;   //on prend une copie du paramètre implicite
  4.   ...
  5.   return post; //on retourne par valeur le résultat
  6. }


 
voila que inf est considéré comme une file vide
je me doute que c'est parce que je n'ai pas de copieur pour ma classe expression, mais jsais pas trop quoi y placer, en sachant que je dois copier "l'expression" mais pas la file, j'comprends pas vraiment :/

Reply

Marsh Posté le 29-10-2004 à 20:56:16   

Reply

Marsh Posté le 29-10-2004 à 21:23:56    

je suis pas clair? jsais pas trop quoi ajouté, mais si vous comprenez pas une partie de mon problème, dites le, jvais tenter de clarifier

Reply

Marsh Posté le 29-10-2004 à 22:02:42    

Eh oh, c'est pas un tchat ici :)
 
On a le droit de faire ses courses, prendre une douche, manger, etc. non ?
 
Bon, pour ton problème. Je pense que ton prof ne voulait pas que tu copies le contenu de l'objet file, plutôt que l'objet lui-même (qui risque de faire une shallow-copy plutôt qu'une deep copy).
 
J'extrapole:
 

Code :
  1. struct Expression {
  2.    enum Type {POSTFIX, PREFIX, INFIX };
  3.    Expression * returnPostFix() const = 0;
  4. };
  5. typedef std::vector<Expression> File;
  6. struct Operation : Expression {
  7.   File myFile;
  8.   enum Type {PLUS, MOINS, FOIS};
  9.   Operation(Expression::Type expressionType, Operation::Type operationType, const File & operands);
  10.   Expression * returnPostFix() const {
  11.      File f;
  12.      f.push_back(this->myFile.front());
  13.      f.push_back(this->myFile.back());
  14.      return new Operation(Expression::postfix, myFile.at(1), f);
  15.   }
  16. };
  17. struct Constante : Expression {
  18.   Expression * returnPostFix() const {
  19.      return new Constante(*this);
  20.   }
  21. };


Message édité par Lam's le 29-10-2004 à 22:04:38
Reply

Marsh Posté le 29-10-2004 à 22:06:55    

je voulais pas pousser pour une réponse, mais jai eu de la difficulté à poser ma question alors j'ai cru qu'elle avait été mal comprise après quelques read du topic
 
sinon pour ton code, jcrois qu'on est pas rendu à ce niveau encore :/

Reply

Marsh Posté le 29-10-2004 à 22:50:17    

en gros dans ma fonction infVersPost()
 
j'ai placé ca:
 

Code :
  1. cout << this->rep.estVide() << endl;
  2.   inf = *this;
  3.   cout << inf.rep.estVide() << endl;


 
et ca m'affiche:
 


0
1


 
je me doute que c'est surement quelque chose de con que je n'ai pas compris, mais je vois pas quoi :/

Reply

Marsh Posté le 29-10-2004 à 23:03:24    

Tu n'as pas d'opérateur d'affectation, et comme inf est une expression (et non une référence sur expression), bah l'objet est vide.  
 
Donc soit tu transforme inf en référence ou pointeur, soit tu écrit un constructeur de recopie et tu surcharges l'opérateur d'affectation pour y mettre ton biniou.


Message édité par Lam's le 29-10-2004 à 23:04:21
Reply

Marsh Posté le 29-10-2004 à 23:13:50    

Lam's a écrit :

Tu n'as pas d'opérateur d'affectation, et comme inf est une expression (et non une référence sur expression), bah l'objet est vide.  
 
Donc soit tu transforme inf en référence ou pointeur, soit tu écrit un constructeur de recopie et tu surcharges l'opérateur d'affectation pour y mettre ton biniou.


 
justement, l'opérateur d'affectation il fera quoi? il devra copier la file de mon objet (rep) dans mon objet inf
 
ca l'implique donc de surcharger l'opérateur d'affectation de la file, et le prof semble dire qu'il faut pas
 
et je peux pas avoir inf comme référence ou comme pointeur, car la conversion inf->post me demande de défiler la file :/

Reply

Marsh Posté le 29-10-2004 à 23:20:11    

Bah oui, il faut pas faire, il a dit ton prof :) Mais je pensais que tu voulais vraiment pouvoir faire ceci=cela;
 
 
Regarde comment j'ai fait dans le code que j'ai mis. Je pense que c'est un bon début.

Reply

Marsh Posté le 30-10-2004 à 00:24:35    

Lam's a écrit :

Bah oui, il faut pas faire, il a dit ton prof :) Mais je pensais que tu voulais vraiment pouvoir faire ceci=cela;
 
 
Regarde comment j'ai fait dans le code que j'ai mis. Je pense que c'est un bon début.


 
 :sweat:  
 
jvois pas
 
trop de truc que je connais pas ou que j'ai pratiquement jamais utilisé
 
edit: jviens d'envoyer un mail au prof pour qu'il tente de m'éclairer sur: comment copier une expression sans faire une copie de sa représentation


Message édité par burgergold le 30-10-2004 à 00:36:22
Reply

Marsh Posté le 30-10-2004 à 00:43:40    

et le destructeur virtuel, ça te troue le cul :D ?
 
typedef std::vector<Expression> File;
--> manque une *

Reply

Sujets relatifs:

Leave a Replay

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