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 :

communication entre classes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Par défaut communication entre classes
    Bonjour,

    J'ai un problème en ce qui concerne la communication entre classes.

    Je viens de commencer dans l'orienté objet et j'aimerais réaliser un programme qui comporte deux classes.

    Mon problème est le suivant :

    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
    class Premier
    {
         constructeurs;
         destructeur;
         méthodes;
         attribut 1;
         attribut 2;
    }
     
    class Seconde
    {
        constructeurs;
        destructeur;
        méthodes;
        attribut 3;
        attribut 4;
    }
    Ce que j'aimerais faire c'est créer un objet de la classe "Premier" dans mon main, ce qui appelera mon constructeur. En fonction des valeurs passées en paramètre à ce constructeur, j'aimerais alors pouvoir agir sur un objet de la classe "Seconde" en modifiant l'attribut 3.

    je ne sais pas comment faire cela...
    j'ai essayé la chose suivante :

    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
    class Premier
    {
         constructeurs;
         destructeur;
         méthodes;
         attribut 1;
         attribut 2;
         Seconde objet2;
    }
     
    dans mon main():
    {
         Premier objet1(param.)
         cout<<objet1.objet2.attribut3;
    }
    Le problème est que ceci me renvoie vraissemblablement une adresse et non le contenu de mon attribut. Selon moi, cet attribut est effectivement sans valeur car j'ai vérifié qu'à aucun moment mon programme n'entre dans le constructeur de mon objet2.

    Pour moi, c'est dans le constructeur de la classe Premier qu'il faudrait ajouter quelque chose pour forcer l'appel au constructeur de l'objet 2.


    je suis conscient que c'est pas facilement compréhensible la façon dont je viens d'expliquer les choses, et au besoin, je me montrerais plus explicite.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    A partir du moment où la classe Première comporte un membre de type Seconde, un des constructeurs de la classe seconde est automatiquement appelé avant que le corps du constructeur de Première ne soit exécuter.

    Comment as-tu testé que ton objet de type seconde n'était pas construit ?

    Pour voir ton problème, il faudrait que tu postes du vrai code qui le reproduise.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Le problème est que ceci me renvoie vraissemblablement une adresse et non le contenu de mon attribut
    D'après le "pseudo-code" que tu as présenté il n'y as pas de raison pour que tu es une adresse affichée, quel est le type de attribut3?
    Comme l'a dit JolyLoic, le constructeur de ta classe Seconde seconde sera appelé juste avant celui de Premier, par défaut c'est bien sur le constructeur par défaut qui est appelé. Si tu le souhaite utilises la liste d'initialisation pour appelé un constructeur spécifique exemple :
    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
    class Seconde
    {
    public:
     
            Seconde() {}
            Seconde(int _i) : m_Att3(_i) {}
     
            ~Seconde() {}
     
            int m_Att3;
    };
     
     
    class Premier
    {
    public:
     
            Premier() {}
            Premier(int ParamObj) : m_Obj(ParamObj) {} //appel du constructeur 1parametre de Seconde
            Premier(int _i1, int _i2) : m_Att1(_i1), m_Att2(_i2) {}
     
    	~Premier() {}
     
    	int m_Att1;
    	int m_Att2;
    	Seconde m_Obj;
    };
     
     
    void main()
    {
    	Premier monPremier(2);
    	std::cout << monPremier.m_Obj.m_Att3 << std::endl;
    }
    Ce code appelera dans un premier temps le constructeur à 1paramètre de Seconde puis le constructeur de Premier... Cela règle-t-il ton problème?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par babar63 Voir le message
    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
    class Seconde
    {
    public:
     
            Seconde() {}
            Seconde(int _i) : m_Att3(_i) {}
     
            ~Seconde() {}
     
            int m_Att3;
    };
     
     
    class Premier
    {
    public:
     
            Premier() {}
            Premier(int ParamObj) : m_Obj(ParamObj) {} //appel du constructeur 1parametre de Seconde
            Premier(int _i1, int _i2) : m_Att1(_i1), m_Att2(_i2) {}
     
    	~Premier() {}
     
    	int m_Att1;
    	int m_Att2;
    	Seconde m_Obj;
    };
     
     
    void main()
    {
    	Premier monPremier(2);
    	std::cout << monPremier.m_Obj.m_Att3 << std::endl;
    }
    Il faut initialiser toutes les données membres dans les listes d'initialisation de tous les constructeurs, sinon certaines ne le seront pas dans certains cas et au final c'est le n'importe quoi assuré.
    Mais peut-être que les constructeurs qui ne servent pas devraient être supprimés surtout.

    MAT.

  5. #5
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    C'était un exemple écrit en vitesse pour montrer l'appel au constructeur dans la liste d'initialisation mais j'aurais du le préciser car c'est vrai que ce code n'a aucun sens

  6. #6
    Nouveau candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Par défaut
    Bonjour,

    Avant tout merci à tous pour vos réponses ...

    Malheureusement c'est ce que j'ai fait il me semble ... Je vous envoie ici le code très simplifié de ce que je veux faire.

    J'ai créé un projet divisé en plusieurs fichiers séparés .cpp et .hpp :
    Malheureusement cela ne fonctionne pas ... j'ai une tonne d'erreurs à la compilation dont "Plateau is not a type".

    Serait-ce possible que ce soit un problème d'édition des liens ?

    De plus, le code ci-dessous, s'il compilait, appellerait le constructeur par défaut pour l'objet de la classe plateau mais comment devrais-je faire pour qu'il appelle le constructeur avec un paramètre. En effet, le compilateur m'interdit de mettre un paramètre lors de ma déclaration dans le fichier Jeu.hpp (du type : Plateau p(int)).

    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
     
    //Main.cpp
     
    #include <iostream>
    #include "Jeu.hpp"
    #include "Plateau.hpp"
     
    using namespace std;
     
    int main ()
    {
        int param;
     
        cout<<"Entrer parametre 1"<<endl;
        cin>> param;
     
        Jeu game (param);
        cout<< game.p.nombre<<endl;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Jeu.hpp
     
    class Jeu
    {
      public
            Jeu(int);
            Jeu();
            ~Jeu();
            int attribut1;
            Plateau p;
     
     
    };
    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
     
    //Jeu.cpp
     
    #include <iostream>
    #include "Jeu.hpp"
     
    using namespace std;
     
    Jeu::Jeu(int a)
    {
          attribut1 = a;
    }
     
    Jeu::Jeu()
    {}
     
    Jeu::~Jeu()
    {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Plateau.hpp
    class Plateau
    {
      public
            Plateau(int);
            Plateau();
            ~Plateau();
            int nombre;
     
     
    };
    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
     
    // Plateau.cpp
     
    #include <iostream>
    #include "Plateau.hpp"
     
    using namespace std;
     
    Plateau::Plateau(int b)
    {
          nombre = b;
    }
     
    Plateau::Plateau()
    {
          nombre = -1;
    }
     
    Plateau::~Plateau()
    {}
    Merci d'avance à ceux qui prendront le temps de me débloquer de cette situation.

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans Jeu.hpp, tu utilises Plateau, sans avoir défini de quoi il s'agit. Ajoute un #include "Plateau.hpp" dans ce fichier.
    Ensuite, tes fichiers ne sont pas protégés contre l'inclusion multiple.

    Pour ton problème, j'ai l'impression que tu ne connais pas l'existence des liste d'initialisation.

    Quand le C++ construit un objet, il :
    - Commence à construire la partie concernant les classes de base éventuelles (avec les informations dans la liste d'initialisation).
    - Puis il initialise les données membre, en utilisant les informations de la liste d'initialisation
    - Puis il appelle le corps du constructeur.

    La liste d'initialisation se défini ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Jeu::Jeu(int a) :
        p(a*a),
        attribut1(a)
    {
    }
    Lire d'ailleur à ce sujet :
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Exercice sur les frontière de pays. - communication entre classes
    Par transab dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/05/2010, 16h54
  2. Communication entre classes
    Par sunshine33 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 03/02/2010, 21h04
  3. Communication entre classes
    Par matteli dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2008, 11h45
  4. Problème de communication entre classe
    Par FabaCoeur dans le forum Général Java
    Réponses: 4
    Dernier message: 22/01/2008, 13h50
  5. [c#] probléme de communication entre classe
    Par OpenGG dans le forum C#
    Réponses: 1
    Dernier message: 24/09/2006, 21h54

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