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

Langage C++ Discussion :

probleme template et polymorphisme


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Par défaut probleme template et polymorphisme
    bonjour,
    je suis tombé sur un problème certainement tout bête dont je comprends la nature mais que je ne vois pas comment contourner, j'en ai fait un petit programme pour voir comment je pouvait faire mais je ne trouve pas :

    le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "Fille.h"
    #include "Essay.h"
     
    int main()
    {
        FilleA fA();
        FilleB fB();
        Essay e();
        e.essay(fA);
        e.essay(fB);
        return 0;
    }
    la class Essay:
    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
    #ifndef ESSAY_H
    #define ESSAY_H
     
    #include "Mere.h"
     
    class Essay
    {
        public:
            Essay();
            virtual ~Essay();
     
            void essay(Mere& m);
     
    };
     
    Essay::Essay()
    {
    }
     
    Essay::~Essay()
    {
    }
     
    void Essay::essay(Mere& m)
    {
        m.f();
    }
     
    #endif // ESSAY_H
    la class Mere:
    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
    #ifndef MERE_H
    #define MERE_H
     
    template<typename T>
    class Mere
    {
        public:
            Mere();
            virtual ~Mere();
     
            virtual void f() = 0;
    };
     
    template<typename T>
    Mere<T>::Mere()
    {
    }
     
    template<typename T>
    Mere<T>::~Mere()
    {
    }
     
    #endif // MERE_H
    les class Filles
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #ifndef FILLE_H
    #define FILLE_H
     
    #include "Mere.h"
    #include <iostream>
     
    class FilleA : public Mere<int>
    {
        public:
            FilleA();
            virtual ~FilleA();
     
            virtual void f();
    };
     
    FilleA::FilleA()
    {
    }
     
    FilleA::~FilleA()
    {
    }
     
    void FilleA::f()
    {
        std::cout << "filleA" << std::endl;
    }
     
    class FilleB : public Mere<double>
    {
        public:
            FilleB();
            virtual ~FilleB();
     
            virtual void f();
    };
     
    FilleB::FilleB()
    {
    }
     
    FilleB::~FilleB()
    {
    }
     
    void FilleB::f()
    {
        std::cout << "filleB" << std::endl;
    }
     
    #endif // FILLE_H
    et bien sur les insultes du compilateurs:
    D:\prog\essayTemplateParamFonction\Essay.h|12|error: 'Mere' is not a type|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: variable or field 'essay' declared void|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: missing template arguments before '&' token|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: 'm' was not declared in this scope|
    D:\prog\essayTemplateParamFonction\main.cpp||In function 'int main()'
    D:\prog\essayTemplateParamFonction\main.cpp|10|error: request for member 'essay' in 'e', which is of non-class type 'Essay()'|
    D:\prog\essayTemplateParamFonction\main.cpp|11|error: request for member 'essay' in 'e', which is of non-class type 'Essay()'|
    ||=== Build finished: 6 errors, 0 warnings ===|
    donc voila, j'aimerai pouvoir passer en paramètre la class Mère à une méthode de Essay, et cela pose problème car Mere est un template mais je ne peux pas mettre Mere<T> car Essai n'est pas un template, je ne vois pas comment rendre cela possible.
    Et transformer Essai en template ne me servirai à rien dans mon programme, et d’ailleurs je ne pense que se soit utile, enfin j’espère pas du moins.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    Enlèves les () lors de la création de tes objets.

    http://cpp.developpez.com/faq/cpp/?p..._list_list_fct

    Ta fonction essay de Essay pose problème aussi. Mere n'est pas un type mais une classe template, il faut donc lui préciser des paramètres templates pour en faire un type.

    Si ces types ne sont pas connue, alors il faut faire de essay un fonction template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<class T>
    void Essay::essay(Mere<T> &m)
    { m.f(); }
    Il n'est pas non plus nécessaire d'expliciter les constructeurs par défaut si ceux-ci ne font rien, le compilateur le fera pour toi. De même pour les destructeurs de tes classes filles (il faut expliciter ceux des classes mères pour indiquer le virtual).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Par défaut
    je comprends pour les contructeurs et destructeurs, mais la c'est juste un exemple pour montrer mon problème.

    par contre, ce que je ne comprends pas, même si ça n'a rien a voir avec mon problème de base, c'est que si j'enlève les () lors de la création de mes objets, qu'en est il de l'appel au constructeur ? et si on doit passer des paramètres à ce constructeur ?
    j'ai tout de même essayé mais voila ce que dit le compilateur :
    D:\prog\essayTemplateParamFonction\Essay.h|12|error: 'Mere' is not a type|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: variable or field 'essay' declared void|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: missing template arguments before '&' token|
    D:\prog\essayTemplateParamFonction\Essay.h|24|error: 'm' was not declared in this scope|
    D:\prog\essayTemplateParamFonction\main.cpp||In function 'int main()'
    D:\prog\essayTemplateParamFonction\main.cpp|10|error: no matching function for call to 'Essay::essay(FilleA&)'|
    D:\prog\essayTemplateParamFonction\Essay.h|12|note: candidates are: void Essay::essay(int&)|
    D:\prog\essayTemplateParamFonction\main.cpp|11|error: no matching function for call to 'Essay::essay(FilleB&)'|
    D:\prog\essayTemplateParamFonction\Essay.h|12|note: candidates are: void Essay::essay(int&)|
    ||=== Build finished: 6 errors, 0 warnings ===|
    mais bon c'est juste pour information.

    sinon, pour en revenir à mon problème, j'ai bien pensé faire de essai un template, mais comme je l'ai dit ça ne m'arrange pas du tout !!!
    car Essay n'a aucun besoin de paramètre template, bien que la c'est juste un exemple, en fait c'est une classe plus complète dans mon programme, c'est pour ça que j'aimerai trouver une autre solution, car si je fait ainsi, je devrai déclarer Essai ainsi : Essai<int> e(); par exemple, mais le <int> ne me sert à rien.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Pour les constructeurs, si tu as des paramètres tu mets les (), si tu en as pas tu ne mets rien.

    Dans le morceau de code que je t'ai donné, la classe Essay n'est pas template, c'est seulement la fonction essay qui est template.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Par défaut
    ok merci.
    j'avais pas compris pour la fonction template.
    j'ai enlevé les () dans le main, et j'ai juste mis la fonction en template, et ça marche !

    mais bon, comme j'aime pas faire des choses sans comprendre, j'ai fait tous les essais possibles en mettant ou non des paramètres à essai et aux classes filles et effectivement, à partir du moment ou il n'y a pas de paramètre, si je met les () alors ça crée des erreurs, s'il y a des paramètres, aucunes erreurs, mais pourquoi ??? je ne comprends pas concrètement ce que change ces foutus parenthèses !!!

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Avec les parenthèses, c'est comme si tu déclarais une fonction !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TypeRetour NomFonction();
    Type NomObjet;

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Il faut tout de même avouer que c'est un point tordu du C++.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Par défaut
    j'avoue que c'est vraiment tordu et je ne le comprends toujours pas :/
    fonction ou pas fonction je ne voie pas en quoi ça provoque des erreurs, et pis ce n'est qu'un appel au constructeur avec les parenthèses après tout ! non ?
    enfin bon, ça me reste en travers de la gorge mais mon problème est tout de même résolu, merci.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Si tu mets des parenthèses (disons A a(); ), alors le compilateur pense que a est une fonction sans paramètre retournant un A. En soit cette ligne compile, par contre lorsque tu vas faire a.m, ca me compilera par car comme a est une fonction elle n'a pas de membre m.

    Le comité aurait pu choisir que A a() est bien la création d'un variable de type A avec une zero-initialisation. Mais dans ce cas comment déclarer une fonction qui ne prend pas de paramètre et retourne un A.

    Il y a plusieurs point du C++ où la syntaxe n'est pas suffisament verbeuse et le contexte trop floue (*) pour permettre au compilateur de comprendre la signification, il faut bien décider laquelle prendre (ou alors rajouter de la verbosité).

    (*) Ce point là se discute, cf certains changement à propos de typename il me semble.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Par défaut
    je n'avais pas du tout pensé que A a(); pouvait être la déclaration d'une fonction, pourtant Trademark l'avais dit mais ça ne m'avait pas paru évident.
    j'ai aussi eu des erreurs ou typename était en effet nécessaire et je comprends mieux ces problèmes liés au contexte et à la syntaxe.
    cette fois c'est bon j'ai compris ^^ merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme template qcm en loadmovie
    Par serna dans le forum Flash
    Réponses: 3
    Dernier message: 05/06/2006, 22h59
  2. Réponses: 14
    Dernier message: 09/05/2006, 15h23
  3. Probleme Template
    Par Muetdhiver dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2006, 11h00
  4. Template et polymorphisme
    Par Pierre_IPROS dans le forum Langage
    Réponses: 19
    Dernier message: 09/10/2005, 23h04
  5. probleme template me renvoi qq chose en trop
    Par Triangle dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/07/2005, 15h01

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