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 :

[Langage] Surdefinition des operateurs dans c++


Sujet :

Langage C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Par défaut [Langage] Surdefinition des operateurs dans c++
    Bonjour
    Un polynôme est représenté par un tableau de ses coefficients. Le coefficient du monôme de degré i est rangé dans l’élément de rang i du tableau des coefficients.
    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
    class Polynome{
               friend Ostream& operator<<(ostream&, const Polynome&);
               friend istream& operator>>(istream&, Polynome&);
    private:
    	int taille;
    	double* coefficients;
    public:
    	Polynome(); 
    	Polynome(int);
    	Polynome(Polynome&);
    	~Polynome() ;
    	void set_taille(int) ;
    	void set_coefficients(double* ) ;
    	int get_taille( ) ;
    	double* get_coefficients( );
    	int degre();
    	double coefAt(int) ;
               Polynome operator+( const Polynome& );
               Polynome operator*(const Polynome& p);
               Polynome operator*(double);
    	bool operator==( const Polynome& );
    	const Polynome& operator=(const Polynome&);
               Polynome operator+=(const Polynome& );
               Polynome operator*=(const Polynome& );
               double calculValPolynome(double);
    };
    on est arrivé a la surdefinition de l'operateur +, voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Polynome Polynome:: operator+( const Polynome& p){
    	Polynome pp;
    	if(this->taille>=p.taille)
    		pp.taille=this->taille;
    	else 
    		pp.taille=p.taille;
    	int i=0;
    	while(i<pp.taille){
    		pp.cf[i]=coefAt(i)+p.coefAt(i);
    		i++;
     
    		} return pp;
    }
    mais il donne une erreur:
    error C2662: 'coefAt' : cannot convert 'this' pointer from 'const class Polynome' to 'class Polynome &'Conversion loses qualifiers


    NB:la méthode coefAt(int i) retourne la valeur du coefficient de rang i.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu n'as pas déclarées constantes les fonctions qui ne modifient pas tes instances...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 38
    Par défaut
    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
    bool Polynome::operator==( const Polynome& p)
    {
    	Polynome pp;
     
    	if(pp.taille=p.taille)
    	{
    		int i;
    		while(i<p.taille)
    		{
    			if(pp.degre()==p.degre()&&(pp.cf[i]==p.cf[i])) 
    				i++;
    			else 
    				return false;
     
    		}
    	}
    	else 
    		return false;
     
    }
    il me donne cette erreur
    warning C4715: 'Polynome::operator==' : not all control paths return a value
    Linking...
    Devoir.obj : error LNK2001: unresolved external symbol "public: int __thiscall Polynome::degre(void)" (?degre@Polynome@@QAEHXZ)

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Pour le warning.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(pp.taille=p.taille)
    	{
    C'est un = ou == ?

    alors si pp.taille>0
    oui, mais i il sera pas forcement égale à 0, sauf en debug ou en CLI.

    Si cela est vrai dés le départ, la méthode retourne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(pp.degre()==p.degre()&&(pp.cf[i]==p.cf[i]))
    si c'est faux, on n'est pas prêt de sortie de la boucle

    En résumé, le code est une horreur !

    Pour l'erreur de link, dans un .h, il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Polynome ...
    {
    ...
      int degre();
    ...
    }
    mais le linker ne trouve pas l'implémentation de cette méthode.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    warning C4715: 'Polynome::operator==' : not all control paths return a value
    signifie qu'il y a des chemins qui peuvent être suivis qui ne renvoient pas de valeur (pas de return associé)...

    Cela t'aurait presque sauté aux yeux si tu avais pris la peine de mettre les accolades pour l'ensemble des blocs d'instructions, car ton code aurait alors eu 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
    bool Polynome::operator==( const Polynome& p)
    {
    	Polynome pp;
     
    	if(pp.taille=p.taille) /* ca devrait etre un "==" ici, car c'est la
                                   * comparaison et non l'assignation
                                   */
    	{
    		int i;
    		while(i<p.taille)
    		{
    			if(pp.degre()==p.degre()&&(pp.cf[i]==p.cf[i])) 
                            {
    				i++;
    			}
                            else 
                           {
    				return false;
    		       }
    		}
    	}
    	else 
           {
    		return false;
           }
    }
    Comme tu peux le constater, dans le bloc if, il est possible que l'on ne renvoie jamais rien... car il est possible de sortir de la boucle parce que i==p.taille sans forcément etre passé par le bloc "else" du test if(pp.degre()==p.degre()&&(pp.cf[i]==p.cf[i]))

    En outre, jusqu'à présent, le seul retour possible est faux... Or, si tu prévois un opérateur ==, c'est que, quelque part, tu envisage le fait que ca puisse aussi être vrai
    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

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Une petite remarque en aparté, tu utilises un double* pour tes coefficients. A moins que ce ne soit un exercice sur les pointeurs, utilises plutôt un conteneur. Tu éviteras beaucoup de problème.
    Si tu gardes tes pointeurs, fais donc un petit tour vers cette FAQ.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Voici un code corrigé, const-correct (pour peu que la fonction membre Polynome::degre() soit const) et qui ne vérifie pas l'égalité du degré plus de fois que nécessaire.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    bool Polynome::operator==( const Polynome& p) const
    {
    	if(this->taille==p.taille && this->degre()==p.degre())
    	{
    		for(size_t i=0 ; i<p.taille ; i++)
    		{
    			if(this->cf[i] != p.cf[i]) 
    				return false;		
    		}
    		return true;
    	}
    	else 
    		return false;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Vu les conversions implicites supportées, en libre, ça serait encore mieux.
    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...

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pourquoi tu mets des this-> partout dans la correction ?

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Pour bien montrer qu'on n'a pas besoin de créer un objet temporaire pp (qui n'était pas initialisé, par ailleurs).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. surdefinition des operateurs en java
    Par sabrinabest dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2007, 12h56
  2. [langage] Compter des éléments dans un tableau
    Par helene22500 dans le forum Langage
    Réponses: 29
    Dernier message: 23/05/2005, 11h38
  3. [langage] compter des caracteres dans une chaine
    Par louisis dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 22h39
  4. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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