Partage
  • Partager sur Facebook
  • Partager sur Twitter

Communiquer entre 2 Objet Réciproquement

Envoyez String a dans class B et String b dans class A

Sujet résolu
    23 mai 2019 à 13:28:07

    Bonjour

    Voila mon problème,

    je voudrais pouvoir atteindre les méthodes d'une class B à partir d'une classe A et réciproquement.

    j'arrive à passer de la A vers la B ou l'inverse,

    mais pas les deux en même temps.

    Voici mes class qui compilent et marchent mais je bloque pour avoir les 2.

    Z.h

    //
    // Created by JAJA on 15/05/2019.
    //
    
    #ifndef ANDROID_Z_H
    #define ANDROID_Z_H
    
    #pragma once
    
    #include "../JuceLibraryCode/JuceHeader.h"
    #include "A.h"
    #include "B.h"
    
    
    class Z : public Component
    {
    
    public:
    
        Z();
        ~Z();
    
        A *m_A = new A();
        B *m_B = new B(*m_A);
    
    };
    
    #endif //ANDROID_Z_H
    

    Z.cpp

    //
    // Created by JAJA on 15/05/2019.
    //
    
    #include "Z.h"
    
    Z::Z() {
    
        addAndMakeVisible(m_A);
        m_A->setBounds(0, 0, m_A->getWidth(), m_A->getHeight());
    
        addAndMakeVisible(m_B);
        m_B->setBounds(0, 0, m_B->getWidth(), m_B->getHeight());
    
    }
    
    Z::~Z() {
    
        m_A = nullptr;
        m_B = nullptr;
        delete m_A;
        delete m_B;
    }
    

    A.h

    //
    // Created by JAJA on 20/05/2019.
    //
    
    #ifndef ANDROID_A_H
    #define ANDROID_A_H
    
    #pragma once
    
    #include "../JuceLibraryCode/JuceHeader.h"
    
    class A : public Component
    {
    
    public:
    
        A();
        ~A();
    
        std::unique_ptr<Label> labelA;
    
    private:
    
    };
    
    
    #endif //ANDROID_A_H
    

    A.cpp

    //
    // Created by JAJA on 20/05/2019.
    //
    
    #include "A.h"
    
    A::A() {
    
        labelA.reset(new Label("new label",
                               TRANS("Text A")));
        addAndMakeVisible(labelA.get());
        labelA->setFont(Font(24.00f, Font::plain).withTypefaceStyle("Regular"));
        labelA->setJustificationType(Justification::centredLeft);
        labelA->setEditable(false, false, false);
        labelA->setColour(Label::backgroundColourId, Colours::black);
        labelA->setColour(TextEditor::textColourId, Colours::black);
        labelA->setColour(TextEditor::backgroundColourId, Colour(0x00000000));
    
        labelA->setBounds(32, 16, 272, 24);
        setSize(360, 640);
        
    }
    
    A::~A() {
        labelA = nullptr;
    }

    B.h

    //
    // Created by JAJA on 20/05/2019.
    //
    
    #ifndef ANDROID_B_H
    #define ANDROID_B_H
    
    #pragma once
    
    #include "../JuceLibraryCode/JuceHeader.h"
    #include "A.h"
    
    
    class B : public Component
    {
    
    public:
    
        B(A &a);
        ~B();
    
        std::unique_ptr<Label> labelB;
    
    private:
        
        A *toA ;
    
    };
    
    #endif //ANDROID_B_H
    

    B.cpp

    //
    // Created by JAJA on 20/05/2019.
    //
    
    #include "B.h"
    
    B::B(A &a) {
    
        labelB.reset(new Label("new label",
                               TRANS("Text B")));
        addAndMakeVisible(labelB.get());
        labelB->setFont(Font(24.00f, Font::plain).withTypefaceStyle("Regular"));
        labelB->setJustificationType(Justification::centredLeft);
        labelB->setEditable(false, false, false);
        labelB->setColour(Label::backgroundColourId, Colours::black);
        labelB->setColour(TextEditor::textColourId, Colours::black);
        labelB->setColour(TextEditor::backgroundColourId, Colour(0x00000000));
    
        labelB->setBounds(32, 80, 272, 24);
        setSize(360, 640);
    
    
        toA = &a;
        toA->labelA->setText("Send From B", dontSendNotification);
    
    }
    
    B::~B() {
        labelB = nullptr;
    }



     voila si qq a une idée pour m'éclairer sur la méthode pour y parvenir.

    merci

    Jeannick

    -
    Edité par JeannickLaunay 23 mai 2019 à 13:39:12

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2019 à 15:31:07

      Salut, est-ce que ce que tu cherches à faire c'est ça ? 
      class B;
      
      class A
      {
      public:
         A();
         ~A();
         ...
      private:
         B * ptrB;
      };
      
      //définitions des méthodes
      
      class B
      {
      public:
        B();
        ~B();
        ...
      private:
         A * ptrA;
      };
      
      //définitions des méthodes
      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2019 à 15:38:24

        Salut Gypso,

        c'est exactement ça.

        mais ça ne fonctionne pas dans mon cas.

        Car j'instancie mes classes A et B à partir dune 3ème Z.

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2019 à 15:45:21

          A a = new A();
          B b = new B(*a);//passage par référence
          a->setPtrB(*b);//pareil
          
          Dans la classe Z avec ce que j'ai écrit avant, est-ce que c'est mieux ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2019 à 15:57:37

            Heu

            je ne comprend pas

            a->setPtrB(*b);//pareil

            et ca me met

            Can't resolve type 'setPtrB'

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2019 à 16:03:30

              Oui il faut que tu ajoutes à ta classe A la méthode setPtrB (ou un autre nom). 

              void A::setPtrB(B &b){
                ptrB = &b;
              }



              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2019 à 16:24:48

                merci

                je me doutais un peu qu'il y avait un truc en plus à mettre.

                Merci en tous les cas de m'aider, j'ai plus l'habitude du Java, je démarre en C++.

                ça compile mais je n'arrive pas a changer mon LabelText...

                Merci Ksass`Peuk

                pour le lien,

                ça ne fonctionne toujours pas mon histoire,

                c'est comme si L'objet B était créé avant que A n'est pu passer la réf sur elle...

                je ne saisi pas tout...

                En tout cas merci de votre aide.

                EDIT:

                Merci

                j'ai résolu

                Il faut que j'accède à mon labelText à partir de la fonction setPtrB.c'est à dire je peux accéder à B à partir de A une fois cette fonction appelée.

                void A::setPtrB(B &b){
                    ptrB = &b;
                    ptrB->labelB->setText("Send From A", dontSendNotification);
                }

                Bonne continuation.

                Jeannick

                -
                Edité par JeannickLaunay 23 mai 2019 à 17:01:00

                • Partager sur Facebook
                • Partager sur Twitter

                Communiquer entre 2 Objet Réciproquement

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown