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 :

heritage et operator*


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut heritage et operator*
    Salut,
    J’ai un problème avec héritage et operator*
    J’ai un classe polynôme dynamique qui hérite de polynôme (abstrait) et
    Un classe polynôme statique qui hérite de la même classe polynôme (abstrait) et une classe de Vector
    Maintenant je dois pouvoir faire

    Polynôme statique ps ;
    ps*= ps ;
    ps*= polynome dynamique ;
    ps*= vector;
    Combien operator* je dois avoir dans le classe polynôme statique ?
    P.S. Quant je mes 2 operator un pour polynôme (abstrait) 2eme avec vector je n’arrive pas faire
    ps*=ps ;

    Merci d’avance pour votre aide

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut, et bienvenue sur le forum

    Sois déjà attentif au fait que ce n'est pas l'opérateur * que tu devrais surcharger, mais l'opérateur *= ...

    En effet, si tu prend l'opérateur * dans son acception mathématique (qui est la multiplication), il renvoie normalement une nouvelle instance de ton polynome, et est à utiliser sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Polynome p1(/*...*/);
    Polynome p2(/*...*/);
    Polynome resultat=p1*p2;
    alors que l'opérateur *= va multiplier le polynome en cours avec l'argument qui lui est passé et renvoyer une référence sur... le polynome en cours (modifié).

    Il sera donc utilisé sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Polynome p1(/*...*/);
    Polynome p2(/*...*/);
    p1*=p2;
    La différence est subtile mais tient au fait que, dans le premier cas, tu aura copie de l'argument en cours que tu n'aura pas forcément dans le second

    Ceci dit, tu dois déclarer autant d'opérateurs différents que tu n'a de types potentiellement à droite de l'opérateur *=, mais, pour que tu puisse utiliser cet opérateur quel que soit le type de polynome utilisé (statique ou dynamique, même si je n'ai aucune idée de la différence que tu fait entre les deux), il faut que ces opérateurs soient déclarés dans la classe de base et appliquent ce que l'on appelle couramment l'idiome NVI (Non Virtual Interface), dont tu as un exemple à propos de l'opérateur << dans la FAQ

    Cela prendrait donc la forme de
    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
    class Polynome
    {
        private:
            /* pour la classe de base, nous ne pouvons pas déterminer le
             * comportement de multiplication...
             * nous déclarons donc des fonctions virtuelles pures (qui auront
             * pour effet de rendre la classe ininstanciable car abstraite)
             */
            virtual void multiply(Polynome const&) =0; // s'applique quand  l'opérande
                                                       //de droite est un polynome 
                                                       // (statique ou dynamique)
            virtual void multiply(Vector const &) = 0; // s'applique quand
                                                       // l'operande de droite est un 
                                                       // vector
        public:
            Polynome& operator*=(Polynome const & rhs)
            { 
                multiply(rhs);
                return *this;
            }
            Polynome& operator*=(Vector const & rhs)
            { 
                multiply(rhs);
                return *this;
            }
     
    };
    class PolynomeStatic :  public Polynome
    {
        private:
            void multiply(Polynome const &); /* à implémenter dans le *.cpp */
            void multiply(Vector const &); /* idem */
            /* les membres intéressants */
    };
    class PolynomeDynamic:  public Polynome
    {
        private:
            void multiply(Polynome const &); /* à implémenter dans le *.cpp */
            void multiply(Vector const &); /* idem */
            /* les membres intéressants */
    };
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut
    Merci beaucoup

    J'ai 2 operator*=
    Donc quant je fait polynome statique *= polynome staitique il utilise le operator*= de polynome (abstrait) mais pas celu ci de especevec
    pourquoi?

    P.S.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class PolynomeS : public EspaceVec<Elem, N+1>, public Polynome<Elem> {
     
    PolynomeS& operator= (const Polynome<Elem>&);
    PolynomeS& operator= (const EspaceVec<Elem,N+1>& );
    }
     
    main()
     
    PolynomeS<int, 5> polyS(2);
    polyS*=polyS utilise (PolynomeS& operator= (const Polynome<Elem>&);)
    mais pas PolynomeS& operator= (const EspaceVec<Elem,N+1>& );
    pourquois?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Injecter une sémantique de valeur dans une hiérarchie de classes polymorphes n'est jamais une partie de plaisir.
    Je partirais définitivement sur du full-template au lieu de l'héritage.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut
    le operator= dans mon classe polynome

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename Elem>
    class Polynome {
     
    Polynome& operator= (const Polynome&){};
    Polynome& operator*= (const Polynome& p){};
    };
    dans le EspceVec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename Elem, size_t N=10>
    class EspaceVec : public VecS<Elem, N> {
     
    EspaceVec& operator= (const EspaceVec&);
    EspaceVec& operator*= (const EspaceVec& p);
    }
    dans mon classe Polnome statique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename Elem, size_t N=10>
    class PolynomeS : public EspaceVec<Elem, N+1>, public Polynome<Elem> {
     
    PolynomeS& operator= (const Polynome<Elem>&);
    PolynomeS& operator= (const EspaceVec<Elem,N+1>& );
     
    PolynomeS& operator= (const Polynome<Elem>& p);
    PolynomeS& operator= (const EspaceVec<Elem,N+1>& p);
     
    };
    mtn quant je vais polynome staique=polynome statique il utilise le 1ere operator= (celui de polynome).
    Est-ce que c'est normal?
    Si oui pourquois?

    Encore un autre problem quant je veux utiliser operaror*= pour multiplier 2 polynomeS ca marche si les taille des polynomeS sont differents, sinon il affiche ambiguous averload for operator*= candidates sont les 2 que j'ai mis dans le polynomeS
    Commant je peux resudre ce probleme?


    Merci d'avance

Discussions similaires

  1. [JSP] thread ? Message d'avancement des operations en cours
    Par buffyann dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 18/12/2003, 11h39
  2. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19
  3. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  4. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46
  5. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53

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