Maths et Délires Des maths et des délires

|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
antony Mathématicien(ne) fou (folle)
Inscrit le: 24 Juin 2005 Messages: 2176 Localisation: Vincennes/Aulnay
|
Posté le: 03 Aoû 2007, 22:38 Sujet du message: C++ |
|
|
Comme c'est visiblement la mode de poser des questions d'informatique, je m'y mets aussi.
J'ai décidé de commencer le C++ pendant les vacances (pour voir et aussi pour essayer de faire le concours de l'ACM) -- et actuellement je me bats avec des passages par référence ou par valeur, et je ne vois pas trop où ça bugue... donc si quelqu'un s'y connait...
Le code est le suivant :
Code: | #include <iostream>
#include <string>
using namespace std ;
class Expr {
public :
virtual void out () const {} ;
} ;
void print (const Expr& e) {
e.out () ;
}
class Constant : public Expr {
int c ;
public :
Constant (int i) {
c = i ;
}
~Constant () {} ;
virtual void out () const {
cout << c ;
} ;
} ;
class Variable : public Expr {
string v ;
public :
Variable (string s) {
v = s ;
}
~Variable () {} ;
void out () const {
cout << v ;
} ;
} ;
class Sum : public Expr {
Expr s1 ;
Expr s2 ;
public :
Sum (Expr& e1 , Expr& e2) {
s1 = Expr (e1) ;
s2 = Expr (e2) ;
print (e1) ;
cout << endl ;
print (s1) ;
cout << endl ;
cout << "+" ;
print (e2) ;
cout << endl ;
print (s2) ;
cout << endl ;
}
~Sum () {} ;
void out () const {
print (s1) ;
cout << "+" ;
print (s2) ;
} ;
} ;
int main ()
{
Variable x = Variable ("x") ;
Constant c = Constant (3) ;
Sum s = Sum (x , c) ;
print (s) ;
return 0;
} |
Ce que je veux coder : une classe Expr qui implémente les expressions arithmétiques, via des classes Constant, Variable, Sum, Product, etc. qui héritent de la classe de base. Mais j'ai un problème avec le constructeur Sum (qui prend deux Expr et construit l'Expr somme). Apparemment il faut passer les deux Expr par référence (quand je les passe par valeur, les instructions print(e1) et print(e2) sont sans effet), mais même comme ça, les instructions print(s1) et print (s2) dans le constructeur sont sans effet.
J'ai essayé de passer ça par pointeur, mais je n'y arrive pas non plus.
Quelqu'un peut-il m'aider ? |
|
Revenir en haut |
|
 |
Overlord Être mi-geek mi-globzoule

Inscrit le: 23 Juin 2005 Messages: 2446 Localisation: Belgique, Louvain-La-Neuve, Bâtiment des Fous.
|
Posté le: 04 Aoû 2007, 0:19 Sujet du message: |
|
|
s1 et s2 étant des Expr, le print va faire appel au out vide (celui tout en haut).
Et ce que tu passes e1 et e2 par valeur ou par référence.
(je sais pas si t'as fait du Java, mais c'est l'un des trucs où on se plante souvent car c'est pas le même comportement (souvenirs...))
Par contre, si s1 et s2 sont des Expr*, out étant virtuelle, print(*s1) va bien appeler le bon out.
Ccl : je passerais e1 et e2 par pointeur, code :
Code: | class Sum : public Expr {
Expr* s1 ;
Expr* s2 ;
public :
Sum (Expr* e1 , Expr* e2) {
s1 = e1 ;
s2 = e2 ;
print (*e1) ;
cout << endl ;
print (*s1) ;
cout << endl ;
cout << "+" ;
print (*e2) ;
cout << endl ;
print (*s2) ;
cout << endl ;
}
~Sum () {} ;
void out () const {
print (*s1) ;
cout << "+" ;
print (*s2) ;
} ;
} ; |
Jillou, si je me suis gouré, dis-le :p _________________ Ceci est un virus de signature. Recopiez-le dans votre signature, s'il vous plait.
Il y a 11 catégories de gens sur Terre :
- Ceux qui vont sourire à cette blague parce qu'ils connaissent le binaire
- Ceux qui la connaissent et qui connaissent le binaire
- Ceux qui ne comprennent pas
Mais 10 d'entre eux ont VRAIMENT besoin de lâcher leur ordi... |
|
Revenir en haut |
|
 |
antony Mathématicien(ne) fou (folle)
Inscrit le: 24 Juin 2005 Messages: 2176 Localisation: Vincennes/Aulnay
|
Posté le: 04 Aoû 2007, 22:47 Sujet du message: |
|
|
Ah, merci.
Oui, j'ai fait un peu de Java à l'X... l'idée d'essayer de construire une telle classe vient d'ailleurs d'un exo de Java.
Maintenant j'ai un autre problème : je veux ajouter une méthode Expr& derive(Variable) qui dérive une expression par rapport à une variable ; du coup je dois d'abord déclarer une classe Variable avant la classe Expr pour pouvoir déclarer cette méthode dans la définition de Expr, mais la définition de la classe Variable doit quand même rester après la définition de la classe Expr (pour pouvoir en hériter). Du coup, le compilateur me dit, quand je définis la méthode derive dans la classe Expr, que "v has incomplete type"... mais je peux pas faire mieux que déclarer Variable auparavant, non ? |
|
Revenir en haut |
|
 |
Overlord Être mi-geek mi-globzoule

Inscrit le: 23 Juin 2005 Messages: 2446 Localisation: Belgique, Louvain-La-Neuve, Bâtiment des Fous.
|
Posté le: 05 Aoû 2007, 0:55 Sujet du message: |
|
|
D'après qqun qui s'y connait (pas moi quoi), c'est impossible à faire.
Son explication : pour appeler derive, le compilo doit savoir cb empiler pour les arg, or pour savoir cb de place il faut allouer pour un B, faut définir B donc A et on l'a dans le baba.
Par contre si ton derive prend un Variable* ça devrait marcher (tiens d'ailleurs si on se met à faire des copies de variables, ça va pas poser problème que le x n'est pas le même x que l'autre x enfin chépas ?)
sinon jpense que tu peux aussi essayer de faire que ça soit une variable qui possède une fonction derive(Expr) qui renvoit une Expr (ou qui modifie l'Expr passée en arg), inverser les args quoi. Là tout reste dans la classe Variable et devrait pas y avoir de prob... _________________ Ceci est un virus de signature. Recopiez-le dans votre signature, s'il vous plait.
Il y a 11 catégories de gens sur Terre :
- Ceux qui vont sourire à cette blague parce qu'ils connaissent le binaire
- Ceux qui la connaissent et qui connaissent le binaire
- Ceux qui ne comprennent pas
Mais 10 d'entre eux ont VRAIMENT besoin de lâcher leur ordi... |
|
Revenir en haut |
|
 |
antony Mathématicien(ne) fou (folle)
Inscrit le: 24 Juin 2005 Messages: 2176 Localisation: Vincennes/Aulnay
|
Posté le: 05 Aoû 2007, 10:28 Sujet du message: |
|
|
ok, merci. |
|
Revenir en haut |
|
 |
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|
|