Methode constante ? [Résolu]

Signaler
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017
-
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017
-
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

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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.
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017

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.
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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).
Messages postés
24
Date d'inscription
lundi 28 novembre 2016
Statut
Membre
Dernière intervention
27 avril 2017

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.