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 sur variable membre


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Points : 342
    Points
    342
    Par défaut pointeur sur variable membre
    Bonjour

    Je voudrais modifier une variable d'un objet depuis un autre objet

    Par exemple

    Dans un objet A j'ai une variable membre a1

    Dans ma classe B, j'instancie l'objet A.

    Dans ma classe C, j'instancie l'objet B
    Dans une de mes méthodes de la classe C, je voudrais modifier la variable a1 de la classe A.

    Sachez qu'il n'y a pas héritage entre ces classes

    Merci pour votre aide:

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Il n'y a pas de différence entre un pointeur sur une variable libre, et un pointeur sur une variable membre.
    Mais je ne crois pas que ce soit la meilleure solution pour modifier une variable encapsulée plusieurs niveau en dessous.

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    MatRem a raison, ce n'est pas bien de faire ainsi (tu casses l'encapsulation). Mieux vaut passer par des accesseurs/mutateurs.

  4. #4
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Ta classe C n'a pas besoin de savoir que A a une variable a1.
    Par contre, elle peut savoir qu'en appelant une fonction (setProperty()) de A, elle modifie le "comportement" de A comme elle le veut...

    C'est à A de gérer comme il se doit ce changement de façon propre... pas aux clients de A

  5. #5
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 246
    Points : 342
    Points
    342
    Par défaut
    Avez vous un exemple SVP

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne connaissais pas cette fonction setProperty().
    A mon avis, cette utilisation permet surtout de détourner la logique.
    Ne faudrait-il pas plutôt se poser la question "Pourquoi la classe C aurait-elle le droit, ou même besoin de modifier un membre de la classe A ?"
    Si on est dans un contexte où a1 est une valeur du type "globale", c'est à dire destinée à être modifiée pas des classes instanciées, alors, je ferais cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class classeA
    {
      private:
        var a1;
        classeB B;
       ...
      public:
        bool Modifa1(var Newa1){a1 = Newa1; return true;}
        ...
    };
    class classeB
    {
      private:
        classeC C;
      ...
    }  
    class classeC
    {
      private:
      ...
    }
     
    // N'importe où dans le main ou une fonction de la classe C, ou ailleurs
      classeA A;  // déclaration et initialisation de A et C
      classeC C;
      if (!A.Modifa1(NewVal))
      {
        printf("ERREUR");
      }
    Le principe est que on ne peut pas faire
    A.a1 = NewVal;
    Mais on a prévu une fonction qui peut le faire.

  7. #7
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Je ne connaissais pas cette fonction setProperty().
    C'est juste un exemple...
    juste histoire de dire qu'il lui faut une fonction set...() (ou pas set...chacun fait comme il veut, mais je trouve ça plus parlant) pour faire ce qu'il veut

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oui, je comprend bien, il faut de toute façon la redéfinir.
    Mais je ne comprend pas très bien comment elle fonctionne. Est-elle un membre virtuel de la classe A? En ce cas, elle est unique et toutes les possibilités de modification de membre (a1, a2, a3 etc.) devront être dans la même fonction.
    Soit elle est à un niveau supérieur, alors là, ça risque de devenir compliqué.

  9. #9
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Personnelement j'éviterais les acceseurs/mutateurs (donc les méthodes set... et get...).

    Je me poserais plutot la question de savoir quel service doit fournir chaque classe. Et si tu te retrouves à ce qu'une classe ai besoin de pouvoir modifier explicitement des attributs d'objet d'une autre classe c'est qu'il y a un couplage assez fort entre ces deux classes (la première doit connaitre les attributs de la seconde !), c'est donc soit qu'elle définisse un service similaire, soit que tu as été trop vite dans les détails, et qu'il faudrait plutot te demander quel service de la seconde classe la première devrait utiliser (et pas comment modifier un attribut d'un objet).

    Emmanuel Deloget a écrit un atricle ou il parle des acceseurs/mutateurs, je trouve son point de vue assez pertinant.

  10. #10
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    Mea Culpa, je n'avais pas du tout compris la question d'origine...

    L'architecture telle qu'elle est soumise me parait pas glop...
    C n'a pas à savoir que B à une variable de type A et à fortiori que A a une variable a1...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je crois que moi aussi j'avais compris à l'envers.
    Je refais le code, qui annule et remplace celui d'il y a deux jours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class classeA
    {
      private:
        var a1;
       ...
      public:
        bool Modifa1(var Newa1){a1 = Newa1; return true;}
        ...
    };
    class classeB
    {
      private:
        classeA *objetA;
      ...
    };  
    class classeC
    {
      private:
        classeB *objetB;
      public:
        bool UneFonction(); 
        classeC();  // constructeur
      ...
    };
     
    // N'importe où 
      classeC *UnObjetC = new ClasseC();
      if (!UnObjet->objetB->objetA->Modifa1(NewVal))
      {
        printf("ERREUR");
      }
     
    //Dans une fonction de la classe C
    bool classeC::UneFonction()
    {
      if (!objetB->objetA->Modifa1(NewVal))
      {
        printf("ERREUR");
      }
    }
    En fait, l'objet de la classe C ne modifie pas le membre a1 de la classe A, mais charge son objet membre B de demander à son objet A de modifier a1.

    Que le plan logique cela me parait tout à fait correct.

Discussions similaires

  1. [POO] Pointeur sur fonction membre et héritage
    Par MrDuChnok dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2006, 17h19
  2. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  3. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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