Methode constante ?

Résolu
madhack Messages postés 23 Date d'inscription lundi 28 novembre 2016 Statut Membre Dernière intervention 27 avril 2017 - Modifié le 18 avril 2017 à 10:23
madhack Messages postés 23 Date d'inscription lundi 28 novembre 2016 Statut Membre Dernière intervention 27 avril 2017 - 19 avril 2017 à 20:03
Bonjour,
Je vous donne le code en premier lieu

duree.hh
#ifndef DUREE_HH_INCLUDED
#define DUREE_HH_INCLUDED

class Duree
{
public :
    Duree(int heures=0, int minutes=0, int secondes=0);
    bool estEgal(Duree const&b); //const//demander pourquoi la methode est constante ou faire un test

private :
    int m_heures;
    int m_minutes;
    int m_secondes;
};

//================================fonction hors de l'objet========================
bool operator==(Duree const& a, Duree const& b);//referance constante pour ne pas modifier les valeurs de l'objet,variable,etc...
#endif // DUREE_HH_INCLUDED


curee.cpp
#include "Duree.hh"

Duree::Duree(int heures, int minutes, int secondes): m_heures(heures),m_minutes(minutes),m_secondes(secondes)
{
}

bool Duree::estEgal(Duree const&b)
{
    return (m_heures==b.m_heures&&m_minutes==b.m_minutes&&m_secondes==b.m_secondes);
}


//===========================fonction hors de l'objet============================
bool operator==(Duree const& a, Duree const& b)
{
    return a.estEgal(b);
}


Message du compilateur

||=== Build: Debug in dureeSurcharge (compiler: GNU GCC Compiler) ===|
E:\projetc++\formation2017\openclassroom\POO\chapPOO2surchargedoperateur\classDureeSurcharge\dureeSurcharge\Duree.cpp||In function 'bool operator==(const Duree&, const Duree&)':|
E:\projetc++\formation2017\openclassroom\POO\chapPOO2surchargedoperateur\classDureeSurcharge\dureeSurcharge\Duree.cpp|17|error: passing 'const Duree' as 'this' argument of 'bool Duree::estEgal(const Duree&)' discards qualifiers [-fpermissive]|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|


J'ai bien compris que dans la fonction operator on appel la methode estEgale de l'objet a afin de comparer ses attributs avec ceux de b.
On passe par des "variables objets" en référance constante afin de "lire" les attributs sans les copier ni les modifier.
Mais je ne comprends pas pourquoi je dois créer la méthode bool estEgal en constante de la manière suivante :

bool Duree::estEgal(duree const& b)const;


Surement un simple problème de logique mais qui me taraude.
Et à ce niveau du cours le concept d'amitié n'as pas encore été abordé on utilise donc une méthode (estEgal ou get)

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
17 avril 2017 à 21:46
Bonjour.

Une méthode, lorsqu'elle est marquée constante, veut dire que celle-ci garantie que l'on ne modifiera pas les attributs en son sein. Lorsque tu passes un objet en "const" (peu importe s'il y a une référence ou non), tu n'as pas le droit d'utiliser des méthodes qui ne seraient pas marquées "const". Si on passe un objet en "const", on ne veut pas que celui-ci soit modifié. Or une méthode peut modifier les attributs d'un objet (et donc l'objet serait altéré). Donc il faut une garantie que l'objet ne soit pas "touché", et c'est là qu'entre en jeu ces méthodes "const".

Le concept d'amitié ou "friend", c'est bien si tu le vois, mais c'est à proscrire dans 99% des cas. Ça consiste à faire sauter les contraintes de visibilité d'un objet envers un autre (ce qui est assez crade). On peut généralement très bien s'en passer.
1
madhack Messages postés 23 Date d'inscription lundi 28 novembre 2016 Statut Membre Dernière intervention 27 avril 2017
19 avril 2017 à 17:51
Bonjour
Et merci pour l'explication.
Je vais essayer dans le code de supprimer la constante, vu qu'il s'agit d'une booléenne, elle ne modifiera pas l'objet malgré qu'il s'agisse d'une référence.
Ou est il plus propre de s'habituer à coder de cette manière ?
A bientôt.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
19 avril 2017 à 17:57
Il est plus propre de s'habituer à coder proprement. Les "const" sont des barrières de sécurité. Si tu les retires en te disant que c'est plus simple sans, il y a un moment où tu ne profiteras pas des ces sécurités (et ça va faire mal).

De plus, quand on lit ton code, avoir une méthode non "const" veut dire que celle-ci va modifier ton objet. Et donc voir une méthode "estEgale" non const, c'est très très louche. Un utilisateur de ta classe ne comprendrait pas pourquoi cette méthode modifierait quoi que ce soit (et se dirait que la classe est mal "désignée", et il aurait raison).
0
madhack Messages postés 23 Date d'inscription lundi 28 novembre 2016 Statut Membre Dernière intervention 27 avril 2017
19 avril 2017 à 20:03
Hum oui vu sous cet angle la.
Je vais essayer d'y penser, ils avaient dit au début du cours de toujours déclarer const ce qui peut l'être.
Mais je rencontre quelques difficultés à ce niveau.
Merci beaucoup et à bientôt.
0
Rejoignez-nous