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 :

interaction entre 2 instances


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 420
    Par défaut interaction entre 2 instances
    Bonjour, je m'initie au C++ avec devC++
    Je n'arrive pas à modifier un champ d'une instance de class en utilisant un autre champ d'une autre instance grâce à une fonction membre. techniquement, je voudrais pouvoir créer une fonction de l'instance "a" qui puisse modifier des éléments de l'instance "b".

    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
    Class article
    (
    public
    int quantité;
    int delta;
    void initialise(int, int);
    void modification(int, int);
    )
    void article::initialise(int q, int d)
    (
    quantité=q;
    delta=d;
    )
    void article::modification(int modif)
    // c'est cette fonction qui me pose problème…
    (
    quantité += modif;
    )
     
    main ()
    {
    article a;
    a.initialise (5,1);
     
    article b;
    b.initialise (10,2);
     
    //maintenant, ici, je souhaite indiquer que le delta 
    //de l'article "a" va modifier la "quantité" d'article "b"
    }
    - premièrement, est ce que la première partie de mon code est juste
    - deuxièmement, je pensais pouvoir écrire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.quantité += a.delta;


    mais je ne sais pas si c'est possible d'écrire ça, et surtout ou le placer (j'imagine dans le "main" pour pouvoir appeler toutes les instances à n'importe quel moment….mais bon !!,je ne suis pas sure de moi…)


    voilà, je sais que l'exemple employé n'est peut être pas judicieux, et je sais qu'il doit y avoir d'autres méthodes pour le réaliser, mais ce dont j'ai besoin, c'est de faire interagir 2 champs différents dans des instances différentes pour une même classe….
    j'espère avoir été claire dans ma demande, (ce n'est pas facile d'exprimer un besoin dans un langage qu'on ne maîtrise pas…)

    merci d'avoir lu….et essayer d'être plus claire que moi…merci

  2. #2
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Plusieurs choses :

    1. Déjà, tu devrais séparer ton code en deux fichiers (.h et .cpp) pour le rendre plus lisible.

    2. Il n'y a pas de ':' après ton public, du coup seul le premier attribut est public, le reste prend les états par défaut (private ou protected je sais plus^^)

    3. Plutôt que de déclarer tout en public (ce qui est relativement dangereux), tu ferais mieux de tout mettre en private et d'écrir des méthodes accesseurs.

    4. Enfin, ta fonction modification déclarée au sein de la classe prend deux paramètres alors que le corps de la méthode écrite n'en prend qu'un seul.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Deux solutions simples :

    Ton but étant à priori l'encapsulation, tu créé un accesseur vers delta en lecture.

    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
    class Article
    (
    private:
      int quantité;
      int delta;
    public:
      inline int getDelta() { return delta; }
      void initialise(int, int);
      void modification(int);
    );
     
    ...
     
    int main()
    {
      ...
      a.modification( b.getDelta() );
      ...
    }
    Deuxième solution :

    Si tu n'a pas besoin d'accéder à delta ailleurs que dans des instances d'article dans ton programme, peut-être peux-tu éviter de faire un accesseur et prendre comme argument de modification un autre article. Tu aura accès à son delta privé car on écrit une méthode d'article.

    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
    class Article
    (
    private:
      int quantité;
      int delta;
    public:
      void initialise(int, int);
      void modification( const Article & );
    );
     
    void Article::modification( const Article & autre )
    (
      quantité += autre.delta;
    )
    ...
     
    int main()
    {
      ...
      a.modification( b );
      ...
    }
    a+

  4. #4
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Je ne vois pas trop ce qui pose problème. si tu veux écrire cela :
    Citation Envoyé par yoyo3d Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.quantité += a.delta;
    dans le main tu dois redéfnir l'opérateur +=
    Consulte la FAQ ou ce tuto pour plus de renseignement à ce niveau.

  5. #5
    Membre éclairé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 420
    Par défaut
    FOR MI DABLE!!! NiamorH, c'est ça que je souhaitait faire....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.modification( b.getDelta() );
    mon niveau étant pour l'instant limité, je vais approfondir ça...
    ensuite j'épplucherais la deuxieme solution...

    Laughing Man
    merci pour les infos...ceci n'était qu'un exemple simplifié....pour 1 et 3 je le savais....
    pour 2et 4 oups...

    befalimpertinent
    dans le main tu dois redéfnir l'opérateur +=
    ???je ne vois pas ce que tu veus dire et à quoi ça sert, un exemple?, une explication?

    en tout cas un grand merci pour vos réponses....

  6. #6
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    article &article::operator+=(const article &a)
    {
        quantite+=a.delta;
        return *this;
    }
    /*et / ou */
    article &article::operator+=(const int delta)
    {
        quantite+=delta;
        return *this;
    }
    De cette façon tu peux écrire dans ton Main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {
      ...
      a+= b;
      a+=10;
      a+=b.getDelta();
      ...
    }

  7. #7
    Membre éclairé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 420
    Par défaut
    Oui... effectivement, c'est pas mal non plus, je connaissait pas....
    sauf que ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
      ...
      a+= b;
      a+=10;
      a+=b.getDelta();
      ...
    }
    je comprend pas....

    a+= b;
    a+=10;
    tu affecte toute l'instance b à a? et apres tu lui ajoute 10....c'est une technique que je n'ai pas encore vu probablement....

  8. #8
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par yoyo3d Voir le message
    je comprend pas....

    a+= b;
    a+=10;
    tu affecte toute l'instance b à a? et apres tu lui ajoute 10....c'est une technique que je n'ai pas encore vu probablement....
    C'est juste parceque j'ai défni deux opérateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    article &article::operator+=(const article &a)
    //et
    article &article::operator+=(const int delta)
    Tu peux donc utiliser += avec une instance d'Article. Dans ce cas le delta de b est ajouté à la quantité de a.
    Mais également, si besoin, directement avec un int (2eme définition de l'opérateur +=)

    C'est toi qui choisit celui qui te convient le mieux ou alors les deux.

  9. #9
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Si ta question portait plus sur
    Dis toi que c'est plus par convention la façon de surcharger l'opérateur +=.
    retourner *this permet de garantir la validité de :

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Je ne vois pas trop ce qui pose problème. si tu veux écrire cela :
    b.quantité += a.delta
    dans le main tu dois redéfnir l'opérateur +=
    b.quantité et a.delta sont tous deux du type int donc à mon humble avis on a plus besoin de redéfinir l'opérateur +=

  11. #11
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par ohini Voir le message
    b.quantité et a.delta sont tous deux du type int donc à mon humble avis on a plus besoin de redéfinir l'opérateur +=
    Exact ! Je voulait en fait dire si tu veux utiliser l'opérateur += sur une instance d'Article dans ton main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Article a,b;
    a+=b;
    ...

  12. #12
    Membre éclairé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 420
    Par défaut
    Sans vouloir abuser, j'ai un problème sur l'écriture de mon code, j'ai probablement merdouiller quelque part, mais je ne vois pas ou…
    La compilation se fait correctement ainsi que l'exécution, mais au lieu d'obtenir 5 et 1 pour "a" et 10 et 4 pour "b", j'obtiens 2293632 et 2009001733 pour "a" et 36 et 2 pour "b", j'ai modifier la valeur dans chaque instance, mais c'est toujours les mêmes chiffres qui s'affichent…..

    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
    42
    43
    44
    #include <iostream>
     
    using namespace std;
    class Article
    {
    private :
      int quantite;
      int delta;
     
    public :
      inline int getDelta()
      {
        return delta; 
      }
      void initialise(int, int);
      int affiche();
      void modification(int);
     
    };
     
    void Article::initialise(int x, int y)
    {
        x=quantite;
        y=delta;
    }
    int Article::affiche()
    {
        cout <<"quantite d'article:" << quantite <<" et delta :"<< delta<< "\n";
    }
     
     
     
    int main()
    {
    Article a;
    a.initialise (5,1);
    a.affiche(); 
    Article b;
    b.initialise (10,4);
    b.affiche();
     
      system("PAUSE");	
      return 0;
    }
    un ptit commentaire?
    merci

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca marcherait mieux comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    quantite = x;
    delta = y;

  14. #14
    Membre éclairé
    Avatar de yoyo3d
    Homme Profil pro
    Administratif
    Inscrit en
    Avril 2002
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2002
    Messages : 420
    Par défaut
    Punaise!!! j'ai relu ce bout de code je ne sais pas combien de fois....et j'avais pas vu ça....

    un grand MERCI!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. interaction entre mon programme & openOffice
    Par artatum dans le forum C
    Réponses: 4
    Dernier message: 10/10/2005, 22h28
  2. [VB .Net][Forms] Interaction entre deux forms
    Par plasticgoat dans le forum Windows Forms
    Réponses: 7
    Dernier message: 24/08/2005, 13h14
  3. [Collaboration/Interaction] Peut-on schématiser une interaction entre un bouton de commande et un autre objet ?
    Par manel007 dans le forum Autres Diagrammes
    Réponses: 5
    Dernier message: 21/09/2004, 01h01
  4. [Débutant] communication entre 2 instances
    Par xiao-long974 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 05/06/2004, 12h07
  5. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24

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