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

 C++ Discussion :

Pointeur et objet


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Tu n'as pas l'impression de faire compliqué là où il serait si simple de faire

    Parce que là, tu commence à rajouter des points qui sont sensés t'aider à te dépétrer d'un problème qui n'aurais jamais du exister, mais qui, en réalité, ne font que t'enfoncer dans ta m...e

    Einstien a dit[QUOTE = einstein]Il faut rendre les choses aussi complexes que possible, mais sans plus![/QUOTE]

    Alors, pour répondre à ta question : oui, il est possible, à partir du moment où une classe dispose d'un pointeur ou d'une référence (non constante) vers une donnée de faire en sorte qu'une fonction membre de cette classe aille modifier la valeur de la donnée pointée / référencée.

    Mais le fait que le langage accepte quelque chose ne veut pas forcément dire qu'il soit opportun de profiter de cette possibilité!

    Et, en l'occurrence, il est très rarement opportun de faire en sorte qu'une donnée soit modifiée par les fonctions d'une classe qui n'est pas responsable de la donnée.

    Cela occasionne ce que l'on appelle un "effet de bord", et, par nature, les effets de bords provoquent bien plus de problèmes que ce qu'ils ne permettent de résoudre

    NOTA : il arrive, car rien n'est jamais simple, en programmation, que l'on n'ait pas vraiment le choix, et qu'il faille -- parfois -- se résoudre à occasionner un effet de bord. Mais cette solution ne devrait être envisagée qu'en toute dernière extrémité, quand toutes les autres solutions envisageables ont été écartées pour des raisons valables.

  2. #22
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Alors, pour répondre à ta question : oui, il est possible, à partir du moment où une classe dispose d'un pointeur ou d'une référence (non constante) vers une donnée de faire en sorte qu'une fonction membre de cette classe aille modifier la valeur de la donnée pointée / référencée.
    si c'est possible quelle erreur ai-je fait ? je ne comprends pas pourquoi ce n'a pas réussi a modifier varSortie

    il arrive, car rien n'est jamais simple, en programmation, que l'on n'ait pas vraiment le choix, et qu'il faille -- parfois -- se résoudre à occasionner un effet de bord. Mais cette solution ne devrait être envisagée qu'en toute dernière extrémité, quand toutes les autres solutions envisageables ont été écartées pour des raisons valables.
    Je ne vois pas vraiment d'autre solution pour résoudre mon problème, et je veux savoir quand même comment faire, quelle erreur j'ai fait, même si qu'après je change de solution

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par haku972 Voir le message
    si c'est possible quelle erreur ai-je fait ? je ne comprends pas pourquoi ce n'a pas réussi a modifier varSortie
    Tout simplement : tu as transmis le paramètre par valeur, ce qui a provoqué une copie locale (au niveau du constructeur) de la variable transmise.

    Or, cette copie locale est -- logiquement -- détruite au moment même l'exécution sort du constructeur, et, du coup, quand une fonction de ta classe essaye de modifier "ce qui est pointé" par le pointeur, il y a deux problèmes majeurs :
    1. Le pointeur pointe vers une adresse mémoire qui ne correspond sans doute pas au type de donnée que l'on s'attend à modifier
    2. et, surtout, la variable d'origine n'est pas modifiée, vu que ce n'est pas l'adresse mémoire de cette variable là que l'on a utilisée

    Pour que cela puisse fonctionner, il faut impérativement que tu transmette la donnée
    soit, directement sous forme de pointeur, en en prenant l'adresse mémoire lors de la transmission ( MaClasse c{&data};)
    Soit en transmettant la donnée en question sous forme de référence


    Je ne vois pas vraiment d'autre solution pour résoudre mon problème, et je veux savoir quand même comment faire, quelle erreur j'ai fait, même si qu'après je change de solution
    Des solutions potentielles, il y en a des dizaines, en fonction de la situation exacte dans laquelle tu te trouves.

    Le problème, c'est que, tant que nous ne saurons pas dans quelle situation tu te trouves, ce qui te pousse à envisager de modifier une variable externe depuis l'intérieur d'une fonction membre, il nous sera particulièrement difficile de te proposer une solution réellement adaptée

  4. #24
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Ah d'accord j'ai compris merci, je vais changé de façon de faire, merci pour votre aide

  5. #25
    Membre régulier
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Août 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 37
    Points : 123
    Points
    123
    Par défaut
    Bonjour

    Bien que la discussion soit marquée "résolue" et en mettant de côté les mises en garde de koala01 sur l'utilisation des pointeurs, je pense qu'il faut que tu travailles ton cours aux chapitres sur les variables, les appels de fonctions et la programmation orientée Objet.

    Ton problème montre que tu dois te poser quelques questions basiques :
    - Quelle est la différence entre la valeur d'une variable et l'adresse d'une variable ?

    - Que se passe-t-il si je copie cette variable, ou si je copie son adresse ?

    - Quelle est la différence entre passer un paramètre par valeur ou par référence à une fonction ?

    - Quelle est la portée d'une variable locale (ex : string varEntree ) ?

    - As-tu compris la différence entre les notions de classe (ex : Testm ) et d'instances de classes (ex : david et goliath ) ?

    - As-tu remarqué que la fonction passerInfo() a le même comportement pour les deux instances?

    - As-tu compris que tes deux instances david et goliath ont trois attributs membres m_objet, m_entree et m_sortie et que, de la façon dont tu les as construits, seul m_objet a une valeur différente ?

    - As-tu compris que tu construis david et goliath, mais que tu ne t'en sers plus après (et donc que leur état ne peut plus changer) ? La fonction passerInfo() ne va pas s'exécuter par magie.

    Tant que tu n'es pas au point sur ces questions, c'est que tu n'as pas encore compris des notions de base sur la programmation procédurale et la programmation objet.
    Les pointeurs sont un outil très puissant mais très périlleux à utiliser. Le niveau de difficulté pour les manipuler correctement est encore un cran au-dessus.

    Heureusement, un débutant n'a pas besoin de les utiliser dès le départ, et même il peut s'en servir sans s'en rendre compte.
    Un bon exemple, c'est que tu utilises un objet de la bibliothèque standard de type std::string que tu as déclaré en variable locale de ton main().
    Cet objet est donc créé sur la pile et son adresse ( &varEntree ) ne change pas, Tu as de la chance, c'est un cas particulier.
    Pas contre, std::string est un objet dynamique. Tu définis varEntree comme une chaîne vide, puis tu lui affectes une valeur et une taille imprévisibles avant l'exécution de ton programme.

    std::string gère lui-même un pointeur vers une zone de mémoire dynamique (allouée sur le tas). Et si cette zone ne convient plus, il est capable d'en allouer une autre plus grande, de recopier les caractères et de libérer l'ancienne zone tout seul et proprement.

    En "C++ Moderne", il est conseillé de bannir l'emploi direct des pointeurs et de s'appuyer sur ces classes qui font le travail à ta place.

    Maintenant, pour en revenir à ton problème de base, tu souhaites qu'un modifiant un objet de main(), cela provoque automatiquement une action sur tes instances de Testm.
    Première remarque : modifier la valeur de varEntree, ne modifie pas son adresse &varEntree, donc les instances david et goliath ne sont pas modifiées.
    Seconde remarque : même si tu modifiais l'adresse de varEntree, david et goliath contiennent des pointeurs qui sont des copies de l'ancienne adresse. Et donc david et goliath ne seraient pas modifiées non plus.
    Troisième remarque : en C++, aucun comportement n'est "automatique" ou "magique". C'est à toi de les coder.

    Pour que la modification d'un objet entraîne un comportement sur d'autres objets indépendants, il faut programmer ce qu'on appelle un Design pattern Observer ou Observateur.

    Je suis d'accord avec koala01 pour le reste. Conceptuellement tu cherches à réaliser des effets de bords. Ça doit être voulu et correctement organisé.
    Il faut donc, avant même de se mettre au code, faire un minimum de conception avec un crayon et un bout de papier pour définir les comportements que tu attends.

  6. #26
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Bonjour, et merci pour ton message, comme koala01 me l'a montré il me faut encore du travail d'apprentissage pour comprendre certaine chose, j'essaie d'aller trop vite et comme j'apprends seul je m'égare, donc merci de me remettre dans les bonnes lignes. J'ai réussi a répondre a certaine de tes questions mais il en reste encore qui sont troubles, donc je vais continuer mon apprentissage. Merci à vous

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/10/2006, 17h03
  2. Perte du pointeur à mon objet
    Par Maxou22 dans le forum C++
    Réponses: 1
    Dernier message: 11/03/2006, 05h42
  3. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36

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