Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours - Programmez avec le langage C++

accès à des privates

Sujet résolu
13 octobre 2021 à 9:38:56

Bonjour à tous,

J'ai une question dans le cours chapitres II Surchargez un opérateur. Il y a cette partie qui me perturbe :

void Duree::operator+=(const Duree& a)
{
    //1 : ajout des secondes
    m_secondes += a.m_secondes;
    //Si le nombre de secondes dépasse 60, on rajoute des minutes
    //Et on met un nombre de secondes inférieur à 60
    m_minutes += m_secondes / 60;
    m_secondes %= 60;

    //2 : ajout des minutes
    m_minutes += a.m_minutes;
    //Si le nombre de minutes dépasse 60, on rajoute des heures
    //Et on met un nombre de minutes inférieur à 60
    m_heures += m_minutes / 60;
    m_minutes %= 60;

    //3 : ajout des heures
    m_heures += a.m_heures;
}

ma question est pourquoi on a accès "m_heures", "m_"minutes" ... de l'objet "a" ? vu qu'ils sont en private.

Merci,

Bien cordialement 

  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 9:43:27

Parce que les restrictions d'accès concernent les classes et pas les objets (= les instances de classe).
  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 9:57:29

Je suis désolé, j'ai peur d'avoir mal compris.

Duree a; // c'est une instance de la class "Duree" ?

cout << a.m_secondes; // affichage de la variable possible ?


Merci, pour votre aide

  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 10:24:25

Regardez bien votre premier code, la première ligne :

void Duree::operator+=(const Duree& a)


Il y a "Duree::", c'est que la fonction fait partie de la classe, donc la fonction a accès aux membres privée de la classe.

Dans votre 2ème poste, on ne sait "où" est ce code. Donc l’accessibilité aux membres privées ne peut pas y être déterminée.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
13 octobre 2021 à 10:46:37

Bonjour,

J'ai bien peur de toujours pas comprendre.

void Duree::operator+=(const Duree& a) // la fonction fait partie de la classe, mais on lui passe en argument une instance externe (ici le "a"?) 


dans le code on ne fait pas un "this->m_heures" mais un "a.m_...". Et pour moi "a" est externe, d'ailleurs cette astuce est utilisé pour additionner les valeurs de deux objets distincts. l'objet actuel où les variables sont directement accessibles "m_secondes" et les variable de l'objet "a" "a.m_secondes" ....

Je suis désolé mais je n'arrive pas à schématiser la logique...

EDIT: j'ai trouvé ma réponse un peu plus loin dans le cours dans un autre exemple 

Vous vous demandez peut-être comment cela se fait qu'on puisse accéder aux attributsm_vieetm_manadupersonnageACopier? Si vous vous l'êtes demandé, je vous félicite, cela veut dire que le principe d'encapsulation commence à rentrer dans votre tête.
Eh oui, en effet,m_vieetm_manasont privés donc on ne peut pas y accéder depuis l'extérieur de la classe… sauf qu'il y a une exception ici : on est dans une méthode de la classePersonnageet on a donc le droit d'accéder à tous les éléments (même privés) d'un autrePersonnage. C'est un peu tordu, je l'avoue, mais dans le cas présent cela nous simplifie grandement la vie. Retenez donc qu'un objet de typeXpeut accéder à tous les éléments (même privés) d'un autre objet du même typeX.

J'avoue que cette logique me perturbé depuis un long moment.

Merci à tous

-
Edité par Sdeau 13 octobre 2021 à 10:55:41

  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 11:01:14

Le but de private est d’empêcher le monde extérieur à la classe de savoir ce qui se passe dans la classe. Quand vous définissez Duree::operator+=, vous êtes dans la classe Duree, donc dans ce contexte, vous pouvez "examiner au scalpel" toute instance de Duree, puisque vous en êtes une, les autres instances n’ont rien à vous cacher puisque vous connaissez vos propres entrailles, qui sont les mêmes pour les autres instances
  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 12:47:43

Bon, on va le redire pour la 10000ème fois sur ce forum, le cours de C++ d'OC est une calamité.

L'extrait que vous postez montre encore une fois que l'auteur n'a qu'une vue très partielle du C++.

@gbdivers et @JadeSalina ont déjà indiqué que le caractère "privée" est au niveau de la classe, pas au niveau de l'instance.

Dans le code de la fonction "Duree::operator+=(const Duree& a)", il y a 2 instances de Duree, l'instance "this" et l'instance "a".

Le code de la fonction a accès aussi bien aux champs privés de a que de "this".

Le fait que l'on n'a pas à écrire "this->m_secondes" mais juste "m_secondes", c'est juste du sucre syntaxique.

Pensez à changer de source d'apprentissage, comme le tuto de zeste de savoir.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
1 novembre 2021 à 0:18:55

J'ai une question sur les classes abstraites , dans le cours on dit qu'il est possible de faire hériter des classes de classe abstraite sans générer d'erreurs en utilisant le code suivant:

int main(){

Vehicule* ptr(0); 

 Voiture caisse(20000,5);

 ptr = &caisse;

cout << ptr->nbrRoues() << endl; 

}.

Mais lorsque je compile , le compilateur me dit que la classe Voiture ne peut pas hériter de la classe abstraite.

Comment faire pour que cela fonctionne.

  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2021 à 9:07:54

Vu autrement

Le code d'une classe a accès aux détails techniques de la classe, et heureusement. Sinon on ne pourrait rien faire.

Même sî ils sont déclarés  privés pour rester des détails internes de réalisation, pas accessibles depuis ailleurs. La réalisation, elle est faite par les fonctions membres de la classe.

--

Classe abstraite : il faudrait voir le code de voiture et de la classe abstraite, ainsi que le message d'erreur complet.

Une classe abstraite sert généralement de base à d'autres classes, l'héritage est donc possible.

-
Edité par michelbillaud 1 novembre 2021 à 9:14:48

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2021 à 17:18:25

bonsoir dans le livre, on dit que le code minimal d'un programme Qt est:

#include

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

return app.exec();

}

Mais je ne vois pas de <QApplication>, j'utilise <QApplicationStateChangeEvent> et on me dit que la variable "app"  a été déclarée mais manque d'inforamations.

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2021 à 17:42:59

Il manque un bout dans ton code, merci d'utiliser la balise dédiée au code (</>)

-> et on me dit que la variable "app" a été déclarée mais manque d'inforamations.

Peut-être justement parce que tu n'inclus pas QApplication ? Je ne vois pas ce que vient QApplicationStateChangeEvent dans cet exemple.

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2021 à 17:58:17

Il est probable qu'il manque le module GUI (ou widgets ? Je sais plus). Le cours a ete ecrit a l'époque de Qt4 (où ce module n'existait pas) et le fonctionnement n'est plus le même. Lors de l'auto completion dans Qt Creator, il ne trouve pas `QApplication` (puisque inaccessible) et propose ce qu'il trouve de plus proche (QApplicationStateChangeEvent qui doit etre defini pour QCoreApplication, je suppose).

Bref, prend un cours a jour.

  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2021 à 18:13:41

StephieGoune:

Merci de créer ton propre fill de discussion au lieux de te greffer (et polluer) un existant qui n'a rien a voir avec ton sujet.

  • Partager sur Facebook
  • Partager sur Twitter
27 novembre 2021 à 22:38:44 - Message modéré pour le motif suivant : Message complètement hors sujet


1 décembre 2021 à 21:36:12

Sur la partie transmission des paramètres du chapitre dédié à l'héritage, lorsque vous dites que l'on peut "transmettre" les paramètres du constructeur de la classe Magicien à celui de la classe Personnage, cela signifie que je peux créer un Magicien avec par exemple le nom "Pierre" qui n'était pas déclaré dans la classe Personnage et le faire accepter par cette classe et toutes les classes qui en héritent .Je ne comprends pas bien cette partie du cours, s'il vous plaît quelqu'un pourrait-il m'aider?

  • Partager sur Facebook
  • Partager sur Twitter
1 décembre 2021 à 21:39:40

Tu ne comprends pas quoi aux messages précédents ???

Deedolith a écrit:

Merci de créer ton propre fill de discussion

Modération a écrit:

Message modéré pour le motif suivant : Message complètement hors sujet


Tu n'auras pas de réponse à tes questions ici, ouvre ta propre discussion !
  • Partager sur Facebook
  • Partager sur Twitter
1 décembre 2021 à 21:46:06

@StephieGoune  Bonsoir, merci de ne pas déterrer d'ancien sujet résolu. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses) un descriptif de votre problème et le code que vous avez écrit inséré sur le forum avec l'outil d'intégration de code soit le bouton code </>.

Je vous contact par MP.

Je ferme ce sujet.

  • Partager sur Facebook
  • Partager sur Twitter