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

Maths et Délires Index du Forum

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

C++

 
Poster un nouveau sujet   Répondre au sujet    Maths et Délires Index du Forum -> Mathématiques taupinales et supérieures
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

MessagePosté le: 03 Aoû 2007, 22:38    Sujet du message: C++ Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Overlord
Être mi-geek mi-globzoule


Inscrit le: 23 Juin 2005
Messages: 2446
Localisation: Belgique, Louvain-La-Neuve, Bâtiment des Fous.

MessagePosté le: 04 Aoû 2007, 0:19    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail Adresse AIM Yahoo Messenger MSN Messenger
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 04 Aoû 2007, 22:47    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé
Overlord
Être mi-geek mi-globzoule


Inscrit le: 23 Juin 2005
Messages: 2446
Localisation: Belgique, Louvain-La-Neuve, Bâtiment des Fous.

MessagePosté le: 05 Aoû 2007, 0:55    Sujet du message: Répondre en citant

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
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail Adresse AIM Yahoo Messenger MSN Messenger
antony
Mathématicien(ne) fou (folle)


Inscrit le: 24 Juin 2005
Messages: 2176
Localisation: Vincennes/Aulnay

MessagePosté le: 05 Aoû 2007, 10:28    Sujet du message: Répondre en citant

ok, merci.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Maths et Délires Index du Forum -> Mathématiques taupinales et supérieures Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com