Methode constante ? [Résolu]

madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - 17 avril 2017 à 20:36 - Dernière réponse : madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention
- 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)
Afficher la suite 

Votre réponse

4 réponses

cptpingu 3786 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 mai 2018 Dernière intervention - 17 avril 2017 à 21:46
0
Utile
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.
Commenter la réponse de cptpingu
madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - 19 avril 2017 à 17:51
0
Utile
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.
Commenter la réponse de madhack
cptpingu 3786 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 mai 2018 Dernière intervention - 19 avril 2017 à 17:57
0
Utile
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).
Commenter la réponse de cptpingu
madhack 24 Messages postés lundi 28 novembre 2016Date d'inscription 27 avril 2017 Dernière intervention - 19 avril 2017 à 20:03
0
Utile
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.
Commenter la réponse de madhack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.