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 :

Utiliser un objet d'une Classe dans une méthode appartenant à une autre Classe.


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut Utiliser un objet d'une Classe dans une méthode appartenant à une autre Classe.
    Bonjour à tous,

    Je suis débutant. J'ignore si mon problème est un problème de codage ou de modélisation.
    Je cherche à utiliser un objet d'une Classe dans une méthode appartenant à une autre Classe.
    Or les objets sont censés être déclarés en privé donc ce que je veux faire ne me semble pas licite.
    Cependant, le problème que j'ai à résoudre semble bel et bien nécessiter une certaine interaction entre ces deux classes.
    Pour résumer mon problème :

    Je veux que ma classe B soit déclarée "occupée" via un booléen si la classe A finit par atteindre une certaine position.
    Autrement dit, que l'attribut "occupé" de mon objet issu de B passe en "true" si l'attribut "position" de mon objet A est compris entre 2 valeurs, ces deux valeurs caractérisant l'objet A.

    En vous remerciant par avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Salut,

    qu'est-ce qui t'empêche d'avoir un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (a.position() >= X && a.position() <= Y)
      b.setOccupied();
    Ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    b.setOccupied(a.position() >= X && a.position() <= Y);
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B b;
    A a(b);
    void A::onPositionReached() { b.setOccupied(); }
    ?

    Or les objets sont censés être déclarés en privé
    Gné ?
    le problème que j'ai à résoudre semble bel et bien nécessiter une certaine interaction entre ces deux classes
    Et bien fais-les intéragir..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Tout d'abord merci beaucoup pour t'être penché sur mon problème, et pour tes bouts de code qu'il va falloir que j'assimile car je suis vraiment au niveau 0.

    En fait, j'avais lu qu'il fallait déclarer les attributs en privé du fait du principe de l'encapsulation d'où ma question sur l'interaction entre 2 classes. Quid de ce principe en fait ?

    Edit : je viens de lire des choses sur les classes amies, un rapport avec mon sujet ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par WipEout37 Voir le message
    En fait, j'avais lu qu'il fallait déclarer les attributs en privé du fait du principe de l'encapsulation d'où ma question sur l'interaction entre 2 classes. Quid de ce principe en fait ?
    Ce principe est globalement correct mais ce dont tu parles c'est même plus du niveau 0 mais carrément -1 de connaissance du langage manquant.
    Les attributs peuvent être privés, mais fort heureusement il existe aussi la portée public et il n'est pas interdit d'avoir des fonctions public pour manipuler la classe. C'est un peu le B.A.BA de la programmation objet et de ce qu'on appelle l'interface de la classe ou encore ses services.
    Lire et apprendre les bases au moins syntaxique ne serait pas un luxe.

    Edit : je viens de lire des choses sur les classes amies, un rapport avec mon sujet ?
    Non
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Merci pour ces éclairages.

    Pourrais-tu critiquer mon code, certainement pas parfait qui me permet d'obtenir ce que je veux (c'est un prototype avant généralisation et automatisation), Cela me permettrait de progresser. En te remerciant.



    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
     
    #ifndef CANTON
    #define CANTON
     
    class Canton
     
    {
     
       public:
     
        //constructeur
        Canton();
        Canton(int debut_canton, int fin_canton);
     
        //méthodes
            bool controler_canton(int position_Tf);
     
       private:
     
        //attributs
        int m_debut_canton;
        int m_fin_canton;
     
    };
     
    #endif // CANTON


    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
     
    #include <iostream>
    #include "Canton.h"
     
    using namespace std;
     
     
    Canton::Canton(int debut_canton, int fin_canton) : m_debut_canton (debut_canton),m_fin_canton(fin_canton)
     
    {
     
    }
     
     
    bool Canton::controler_canton(int m_position_Tf)
     
    {
     
    if (m_debut_canton < m_position_Tf && m_position_Tf < m_fin_canton);
     
    cout <<(m_debut_canton < m_position_Tf && m_position_Tf < m_fin_canton);
     
      }


    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
     
     
    #include <QCoreApplication>
    #include <iostream>
    #include "Canton.h"
     
     
    using namespace std;
     
     
    int main()
     
    {
     
          Canton canton1(0,1500), canton2(1500,3000);
     
         int m_Vact=320;
         int m_position_Tf=0;
          int i=0;
     
    for (i=0; i<1000; i++)
     
    {
    m_position_Tf=m_position_Tf + m_Vact*1000/3600;
    canton1.controler_canton(m_position_Tf);
    canton2.controler_canton(m_position_Tf);
    cout << "   " << m_position_Tf << "\n";
     
     
    }
     
     
     
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Ce code ne devrait même pas compiler
    - tu déclares un constructeur sans paramètre mais ne l'implémentes pas
    - ta fonction controler_canton sencée retourner un bool et il n'en est rien

    - la const-correctness est une habitude à prendre
    - la lisibilité laisse à désirer
    -> les sauts de ligne au hasard
    -> indentation inexistante
    - déclarer les variables au début c'est bon en C, en C++ on préfèrera les déclarer le plus tard possible, dès qu'on en a besoin
    - laisse tomber using namespace std; et use ton clavier pour écrire std::, promis il s'usera pas beaucoup et ça aidera tout le monde sur le long terme
    - "\n" => std::endl
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Ok je te remercie !

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 628
    Points : 10 553
    Points
    10 553
    Par défaut
    Pour te donner un peu de termes à chercher avec ton moteur Web favori :

    Tu as 2 approches :
    • Soit tu fais une composition. Et une composition peut être réalisée avec un héritage en mettant les composants dans la classe mère.
    • Soit tu fais une agrégation. Pour ce cas, c'est l'injection de dépendances (<- lien wiki anglais)


    Dans les exemples de Bousk, message 2 :
    • L'exemple 1 et 2 c'est de la composition, soit c'est a qui est dans b, soit c'est b qui est dans a
    • L'exemple 3 c'est de l'agrégation via le constructeur ("constructor injection")


    Ensuite, il y a un mix entre les 2 ... mais plus complexe : Tu peux faire un "service" avec au moins 1 fonction "set_is_busy" que ta classe appelle lorsqu'elle est entre les 2 positions.
    L'idée du service c'est qu'il peut être global et/ ou que ta classe peut garder une référence sans se poser de question sur sa gestion.
    Et évidemment tu mets toute la logique métier dans cette fonction "set_is_busy".

  9. #9
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Salut !

    Je te remercie pour ces explications très utiles ! J'avoue que je n'ai pas encore tout saisi (mais c'est normal). Très intéressant, vraiment !

    Merci encore.

  10. #10
    Membre du Club
    Homme Profil pro
    dev
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 63
    Points
    63
    Par défaut
    Je me permets d'ajouter ce lien d'un cours que je trouve pas mal et qui évoque certaines des notions évoquées plus haut.
    Cela pourra peut être aider d'autres personnes.

    http://tvaira.free.fr/dev/cpp/poo-c++.pdf

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 960
    Points
    32 960
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    L'exemple 1 et 2 c'est de la composition, soit c'est a qui est dans b, soit c'est b qui est dans a
    Plutôt a et b sont dans un super-objet qui les gère, et n'ont aucune connaissance l'un l'autre (ni du super-objet), seul ce super-objet connait et contrôle les 2
    Citation Envoyé par foetus Voir le message
    L'exemple 3 c'est de l'agrégation via le constructeur ("constructor injection")
    L'exemple utilise un b déjà créé par simplicité et clarté, mais si b était créé membre de a, ce serait une composition
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. [Débutant] Utiliser un objet d'un form dans une classe
    Par LIANAZEL dans le forum C#
    Réponses: 2
    Dernier message: 14/06/2016, 09h32
  2. Réponses: 4
    Dernier message: 19/11/2014, 16h44
  3. Réponses: 2
    Dernier message: 23/05/2010, 12h45
  4. Réponses: 1
    Dernier message: 11/04/2006, 20h43
  5. Réponses: 9
    Dernier message: 05/07/2005, 08h37

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