IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Probleme avec le polymorphisme et les templates :(


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut Probleme avec le polymorphisme et les templates :(
    bonjour a tous,

    excusez moi du d�rangement mais voila,j ai un gros probleme avec le

    polymorphisme et les templates en C++

    et je dois rendre un exercice a mon prof pour mercredi soir au plus tard

    je vous explique en quelque mot ce que mon programme doit faire :

    - tout d abord,on as une classe Billet (qui est abstraite,c est a dire qu on ne peut pas cr�er d objet de ce type).

    - ensuite on a une classe EuroBillet (abstraite �galement) qui h�rite de la classe Billet

    - ensuite on a une multitude de classes telles que : EuroB5,EuroB10,EuroB20,etc .... qui h�ritent de la classe EuroBillet

    - fiinalement,on a une classe totalement independante des autres, appell�e : Portefeuille

    dans cette classe Portefeuille,c est donc un pointeur sur tableau de pointeurs sur objet de cette maniere :

    Billet ** _TabPort ;

    - dans ce portefeuille donc,on doit etre capable d y placer des objets de differentes classes (EuroB5,EuroB10,etc...)

    je dois donc utiliser les fonctions virtuelles et les templates.

    les fonctions virtuelles j ai r�ussit a les faire.

    mais les templates,j y comprends rien car j �tais malade,le jour ou ils ont vu ca en classe

    pour ne pas flooder ici , je vous mets le lien ou vous pouvez prendre mon code

    ce serait sympa de m'aider ,et je vous en remercie tous d'avance

    http://perso.latribu.com/softstar/portefeuille.cpp

    PS : on utilise Dev C++

  2. #2
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    En fait, on peut sans doute dire que tes billets sont des classes templates h�ritant de EuroBillet.
    Pourquoi ?
    Parce que ces billets ont une valeur g�n�rique, 5�, 10�, 20� qui est connue � la compilation.
    Donc outre ta classe EuroBillet, tu auras une classe
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<unsigned int Valeur>
    classe EuroB : public EuroBillet
    {
    public:
      EuroB()
      :EuroBillet(Valeur)
      {}
    }
    En admettant que c'est l'objet parent qui g�re la valeur du billet.

    edit : apr�s avoir regard� ton code, c'est en gros �a que tu vas faire, le constructeur fils appelle le constructeur p�re avec la bonne valeur de la monnaie et la vraie valeur - imontant -

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    merci,mais ca ne fonctionne pas

    quand je compile,ca me mets ceci :

    128 C:\PROGRAMMATION\C++\GI3_C++_NEW\MesProg\portefeuille\portefeuille.cpp

    multiple types in one declaration

  4. #4
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Bonjour,
    je ne vais pas te faire un cours sur les templates, et je ne vais pas non plus faire le code.

    Tu peux d�j� regarder les templates, c'est dans la faq C++ de developpez. Sinon, tu peux tr�s bien utiliser ton portefeuille sans template (ton prof t'oblige peut-�tre � les utiliser).
    Le code ressemblerait � ceci avec la d�claration Billet ** _TabPort; :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    _TabPort = new Billet [50];
    _TabPort[0] = new EuroB5();
    _TabPort[1] = new EuroB10();
    ...
    Donc ici, tu n'utilises pas de template. Je pense que votre prof voudrait peut-�tre un truc du style :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    _TabPort = new Billet [50];
    _TabPort[0] = new Billet<EuroB5>;
    _TabPort[1] = new Billet<EuroB10>;
    ...
    Donc la par contre tu utilises les templates, je pense (voir d'autres avis) que tu dois juste rendre Billet template (je crois pas que EuroBillet ait besoin de l'�tre).

    Euh, j'espere que j'ai r�pondu � une partie de la question car Miles rend template la valeur du billet.

    Bonne journ�e.

    b Oo

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    merci b O o , ca je suis arriv� a le faire,j'arrive a placer des billets de n importe quel type dans mon portefeuille

    par contre,la ou ca coince , c est quand par exemple j utilise la fonction :

    DelBillet(uint pos) ; // on retire un billet du portefeuille

    car je dois renvoyer le billet par r�f�rence
    (pour par exemple pouvoir l utiliser pour faire un achat , c'est symbolique bien sur)

    et si je renvoye un objet de type Billet comme ceci :

    Billet & DelBillet(uitn pos)

    ben,le programme plante en me disant que je ne peut renvoyer un objet de type billet car Billet est une classe abstraite

    donc je suppose que je doit utiliser les templates pour dire a ma fonction
    DelBillet de renvoyer le bon type de billet

    mais je vois pas comment faire

    merci a tous de votre aide en tout cas

  6. #6
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Je viens de voir ton programme, en fait, ce que j'ai �cris pr�c�demment remet en question tout ton programme.

    Miles t'indique (je pense que ceci est le mieux), que lorsque tu d�finies ta classe EuroB template, cela t'�vite de faire une classe pour chaque billet, par exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    EuroB<5> b5; //cree un billet de 5 euros
    EuroB<1à> b10; //cree un billet de 10 euros
    ...
    Donc cela va t'enlever pas mal de classes.
    Je te montre une classe template pour exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    template <class T = int> // = int permet de dire que par défaut T est int
    class TVecteur
    {
     public:
      TVecteur(int = 0);
      TVecteur(const TVecteur<T> &);
      void AddElement(const T & val);
      TVecteur<T> operator=(const TVecteur<T> &);
      virtual ~TVecteur();
     private:
      T * vect;
      int taille; // taille actuelle du tableau
      int capacite; // taille max du tableau
    };
     
    template <class T>
    TVecteur<T>::TVecteur(int _capacite):vect(0),taille(0), capacite(_capacite)
    {
      vect = new T [capacite];
    }
     
    template <class T>
    TVecteur<T>::TVecteur(const TVecteur<T> & v): vect(0), taille(0), capacite(0)
    {
      if (this != &v)
        Recopie(this, &v);
    }
     
    template <class T>
    void TVecteur<T>::AddElement(const T & val)
    {
      ...
    }
    template <class T>
    TVecteur<T> TVecteur<T>::operator=(const TVecteur<T> & v)
    {
      ...
    }
    Quand tu fais une classe template, la d�finition des m�thodes doit se faire dans le .h

    b Oo

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    ohhh la la la la , tu viens de m'embrouiller la boo

    en fait,j ai pas le choix,le prof veut qu on utilise les classes que je t ai dites

    donc ,cr�er une classe template pour eviter de creer des classes s�par�es,ca le fera pas

    je rappelle mes classes obligatoires :

    Billet , classe abstraite

    EuroB , classe abstraite , qui h�rite de Billet

    EuroB5,EuroB10,EuroB20,EuroB50,EuroB100 , qui h�ritent toutes de EuroB

    et Portefeuille qui est independant

    comme je l'ai dit auparavant,mon probleme c est dans la classe P�rtefeuille

    je cr�e mon portefeuille,j y mets les differents billets (EuroB5,EuroB10,etc..)

    mais c est quand je veut par exemple en supprimer un (l enlever du portefeuille pour l utiliser par la suite (donc le renvoyer par reference))

    que la ca plante car je vois pas comment lui dire dans la fonction DelItem(), que il doit renvoyer l'objet du type : EuroB5,
    ou EuroB10,
    ou EuroB20,
    ou EuroB50,
    ou EuroB100
    voila , je sais pas comment etre plus clair parfois je m y perds un peu , snifff

    merci en tout cas de votre aide,vous etes tous super

  8. #8
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Je pense que le probl�me vient du fait que, DelBillet supprime le billet du portfeuille (donc tu ne l'as plus en m�moire) et donc tu ne pas retourner une r�f�rence de celui-ci car tu l'as supprim�.
    Par contre, si tu veux le recuperer dans le programme principal, tu ne peux faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Billet monBillet = monPorteFeuille.DelBillet();
    par contre tu peux faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    Billet * monBillet = monPorteFeuille.DelBillet();
    Si DelBillet() renvoie un pointeur et si tu ne supprime pas le billet de la m�moire.

    J'esp�re que cela r�pond � ta question.

    b Oo

    Edit: "C'est bon j'ai bien compris l�, c'est juste que dans le 1er post tu ne fais pas mention du probl�me de DelBillet"

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    bon je te montre ce que j ai fait,et ca me plante a la figure

    il compile sans probleme

    dans mon main() , je fais ceci :

    pf1.DelBillet(1);
    pf1.Display();

    donc je retire le billet a la position 1 du portefeuille (donc position 0 en c++)
    puis j affiche le contenu du portefeuille
    mais a l'execution , il m affiche bien ce que je veut
    puis windows fait l'erreur systeme suivante :

    l'instruction a "0x00409089" r�ference la memoire a "0x06fffffc" , la memoire ne peut pas etre "ecrite" , clicker sur ok pour terminer,clicker sur cancel pour debugguer le programme.

    voici ma fonction Delitem(),si vous savez m'aider :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Billet & DelBillet(uint pos){
            if (!IsBillet(pos)) throw "Erreur";
            total-=_TabPort[pos]->GetMontant();
            Billet & temp=*_TabPort[pos];
            delete _TabPort[pos];
            _TabPort[pos]=0;
     
            for(uint i=pos; i<_Contenance; i++) 
            {
            if (i+1<_Contenance) _TabPort[i]=_TabPort[i+1];
            else _TabPort[i]=0; 
            }
            return temp;
            }
    voila je vous remercie tous d'avance

  10. #10
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    plus personne , snif ?

  11. #11
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    Citation Envoy� par softstar
    en fait,j ai pas le choix,le prof veut qu on utilise les classes que je t ai dites

    donc ,cr�er une classe template pour eviter de creer des classes s�par�es,ca le fera pas
    Bon, alors il faut les mettre o� les templates ? Parce que l�, il n'y a rien qui ne soit pas du polymorphisme "classique".

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    miles,possible que finalement je ne doivent pas utiliser les templates

    par contre,cfr mon post un peu plus haut

    j'ai un probleme avec ma fonction delbillet

    tu sais y jeter un oeil svp ? je t'en remercie d avance

  13. #13
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Ben en fait tu d�clares temp dans DelBillet, donc comme temp est une r�f�rence sur _TabPort[pos] que tu d�truis juste apr�s, temp ne fait plus r�f�rence � aucun objet.
    Voila pourquoi cela plante.
    Je pense que le code suivant fait ce que tu attends, mais la ca ne va compiler :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Billet & DelBillet(uint pos)
    {        
      if (!IsBillet(pos)) 
        throw "Erreur";
      total-=_TabPort[pos]->GetMontant();
      Billet temp = *_TabPort[pos]); /* va te dire que Billet est une classe abstraite */
      delete _TabPort[pos];        
      _TabPort[pos]=0;
      for(uint i=pos; i<_Contenance; i++)
      {        
        if (i+1<_Contenance) 
         _TabPort[i]=_TabPort[i+1];
        else _TabPort[i]=0;        
      }        
      return temp;
    }
    En plus, ici temp est un objet qui est d�truit � la fin de la m�thode, donc la r�f�rence sera encore invalide, mais cette fois dans le programme principal.

    Et maintenant le code que tu veux faire et qui je pense fonctionne :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Billet & DelBillet(uint pos)
    {        
      if (!IsBillet(pos)) 
        throw "Erreur";
      total-=_TabPort[pos]->GetMontant();
      Billet * temp = _TabPort[pos];        
      _TabPort[pos]=0;
      for(uint i=pos; i<_Contenance; i++)
      {        
        if (i+1<_Contenance) 
         _TabPort[i]=_TabPort[i+1];
        else
          _TabPort[i]=0;        
      }        
      return *temp;
    }
    La par contre, le probl�me c'est que pour le supprimer on va avoir du mal, (a moins que delete &nomdelref fonctionne, mais je ne suis pas s�r). Et en plus je ne sais pas s'il va pas te dire qu'on utilise Billet.

    Ce que je ferais, moi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     Billet * DelBillet(uint pos)
     {        
       if (!IsBillet(pos)) 
         throw "Erreur";
       total-=_TabPort[pos]->GetMontant();
       Billet * temp = _TabPort[pos]; 
       _TabPort[pos]=0;
       for(uint i=pos; i<_Contenance; i++)
       {        
         if (i+1<_Contenance) 
          _TabPort[i]=_TabPort[i+1];
         else 
         _TabPort[i]=0;        
       }        
       return temp;
    }
    Ici je pense qu'il n'y a pas de probl�me, il faut juste que tu n'oublis pas de faire un delete.

    Je sais que toi tu veux :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Billet & DelBillet(uint pos)
    Essaye le code 2, mais je ne suis pas convaincu que cela fonctionne.
    Sinon, si tu ne veux absolument pas de pointeur, alors il ne faut pas rendre Billet abstraite. Et alors ta m�thode sera la suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     Billet DelBillet(uint pos)
     {        
       if (!IsBillet(pos)) 
         throw "Erreur";
       total-=_TabPort[pos]->GetMontant();
       Billet temp = _TabPort[pos];
       delete _TabPort[pos];
       _TabPort[pos]=0;
       for(uint i=pos; i<_Contenance; i++)
       {        
         if (i+1<_Contenance) 
          _TabPort[i]=_TabPort[i+1];
         else 
         _TabPort[i]=0;        
       }        
       return temp;
    }
    J'espere avoir �t� clair.

    A+

    b Oo

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    74
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Par d�faut
    Merciiiiiii Booo

    ton code 2 fonctionne nickel

    merci encore a toi

  15. #15
    Membre confirm� Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Par d�faut
    Tant mieux,
    personnellement je pense qu'utiliser des r�f�rences sur des objets allou�s dynamiquement est source d'erreurs, donc fait attention � cette utilisation.

    Sinon, met le sujet � r�solu (tu vas dans outils de discussion en hau tde ton 1er post et ensuite mettre sujet � r�solu).

    Bonne journ�e.

    A+

    b Oo

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 4
    Dernier message: 06/07/2009, 11h22
  2. Probleme avec l MasterPage et les sousDossier d'un site
    Par DelphiCool dans le forum ASP.NET
    R�ponses: 8
    Dernier message: 26/02/2008, 14h44
  3. R�ponses: 3
    Dernier message: 17/11/2007, 18h59
  4. Probleme avec shutil.copytree et les partages reseau
    Par balisong dans le forum G�n�ral Python
    R�ponses: 1
    Dernier message: 04/09/2007, 15h59
  5. simuler le polymorphisme via les templates
    Par ronaldino dans le forum C++
    R�ponses: 10
    Dernier message: 28/11/2006, 00h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo