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

SL & STL C++ Discussion :

Imbrication de classe et conteneur list


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut Imbrication de classe et conteneur list
    Bonjours à tous. Voici mon problème sur lequel je bûche depuis quelques soirs déjà.

    J'ai trois classes: cA, cB et cC définies comme suit - je précise que chaque classe est composée d'un fichier en-tête (*.h) et d'un fichier de définition du contenu des fonctions (*.cpp) et que tout a été rassemblé ici pour plus de clarté:

    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
    class cA
    {
        public:
             cA();
             ~cA();
             void AjouterB( cB &B ){ m_A.push_back( B ); };
     
             std::list<cB> m_A;
    }
     
    class cB
    {
        public:
             cB();
             ~cB();
             void AjouterC( cC &C ){ m_B.push_back( C ); };
     
             std::list<cC> m_B;
    }
     
    class cC
    {
        private:
            int m_i;
     
        public:
             cC(){ m_i = 0; };
             ~cC();
             void MettreLaValeurDeIA( int i ){ m_i = i; };
             int I(){ return m_i; };
    }
    Ensuite je créé un objet C et affecte une valeur à la variable membre m_i.
    Puis je créé un objet B auquel j'ajoute l'objet précédemment créé - l'objet C donc - via la fonction AjouterC().
    Enfin je créé un objet A auquel j'ajoute l'objet B via la fonction AjouterB().

    Dans mon programme, l'objet A contient plusieurs objets B contenant eux-mêmes plusieurs objets C.

    Pour tout parcourir, j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::list<cB>::iterator iter_B;
     
    for( iter_B = m_A.begin(); iter_B != m_A.end(); iter_B++)
    {
        std::list<cC>::iterator iter_C;
     
        for( iter_C = (*iter_B).m_B.begin(); visee != (*iter_B).m_B.end(); iter_C++)
        {
            cout << (*iter_C).I();
        }
    }
    Je pensais - peut-être à tort - que j'obtiendrais la valeur que j'avais passer à m_i. Or je me retrouve avec la valeur 0, celle de l'initialisation de l'objet C.

    En espérant avoir été clair. Si quelqu'un pouvait éclairé ma lanterne.

    Merci.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    On ne va pas beaucoup pouvoir t'aider sans EMCRP (exemple minimal *compilable* qui reproduit le problème)

    Parce que perso je n'arrive pas à le reproduire ton problème. Le code suivant affiche bien la valeur passée à m_i :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <list>
    #include <iostream>
     
    class cC
    {
        private:
            int m_i;
     
        public:
             cC(){ m_i = 0; };
             void MettreLaValeurDeIA( int i ){ m_i = i; };
             int I(){ return m_i; };
    };
     
    class cB
    {
        public:
             void AjouterC( cC &C ){ m_B.push_back( C ); };
             std::list<cC> m_B;
    };
     
    class cA
    {
    public:
       void AjouterB( cB &B ){ m_A.push_back( B ); };
     
        std::list<cB> m_A;
    };
     
     
    int main()
    {
     
    	cC c;
    	c.MettreLaValeurDeIA(4);
    	cB b;
    	b.AjouterC(c);
    	cA a;
    	a.AjouterB(b);
     
    	std::list<cB>::iterator iter_B;
     
    	for( iter_B = a.m_A.begin(); iter_B != a.m_A.end(); iter_B++)
    	{
    		std::list<cC>::iterator iter_C;
     
     		for( iter_C = iter_B->m_B.begin(); iter_C != iter_B->m_B.end(); iter_C++)
    		{
    			std::cout << iter_C->I();
    		}
    	}
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Merci d'avoir regarder.

    Voilà le code source. Il vous faudra wxWidgets 2.8.10 (pour que ce soit simple il faut prendre le dernier wxPack via google) et mingw32 - les deux dll sont fournies en revanche les fichiers pour l'édition des liens non. Comme j'utilise code::blocks 8.02 pour le développement, il y a déjà un fichier projet dans l'archive.

    La classe A correspond à la classe CCarnet (class_Carnet.h et class_Carnet.cpp), la classe B à la classe CStation (class_Station.h et class_Station.cpp) et la classe C à la classe CVisee (class_Visee.h et class_Visee.cpp).

    Pour arriver à mon problème, compilez et exécutez le programme. Faites Carnet > Nouveau > Appliquer & Fermer. Puis faites Manipulations > Ajouter une nouvelle ligne.

    En regardant le code vous verrez que je crée ma station avec des valeurs, que je crée des visées avec des valeurs, que j'ajoute ces visées à ma station, et que j'ajoute ma station à mon carnet - qui est une variable globale définie dans le fichier agrimensoresVariables.h.

    Sinon dans le fichier class_Station.cpp, dans la fonction AjouterStation il y a un bout de code à dé-commenter pour voir le problème.

    Merci.

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Euu non désolé tu as mal lu.
    J'avais demandé un EMCRP c'est à dire un exemple *minimal*, compilable, qui reproduit le problème.
    Perso, je ne vais certainement pas installer wxwidget et code::block juste pour aider.

    Par minimal, j'entends un code comme celui que j'ai montré au post précédent. Réduit au minimum, pas plus de 200 lignes, qu'il suffit de copier-coller dans un main.cpp, compiler et lancer. Un peu comme ce que tu as commencé de faire dans ton premier post avec les classes cA, cB et cC, mais cette fois sans planquer la partie :
    Citation Envoyé par zoom*
    Ensuite je créé un objet C et affecte une valeur à la variable membre m_i.
    Puis je créé un objet B auquel j'ajoute l'objet précédemment créé - l'objet C donc - via la fonction AjouterC().
    Enfin je créé un objet A auquel j'ajoute l'objet B via la fonction AjouterB().
    puisque clairement le problème viens de là....

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Dommage .

    Alors voilà le code:

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
    #include <list>
    #include <iostream>
     
    /// Classe CVisee
     
    class CVisee
    {
        private:
            double      m_HP, m_G, m_AH, m_AV, m_Dh, m_Di;
     
        public:
            CVisee();
            CVisee(CVisee const &);
            CVisee operator=(CVisee &src);
            ~CVisee();
     
            void Set_HP( double valeur ){ m_HP = valeur; };
            void Set_G( double valeur ){ m_G = valeur; };
            void Set_AH( double valeur ){ m_AH = valeur; };
            void Set_AV( double valeur ){ m_AV = valeur; };
            void Set_Dh( double valeur ){ m_Dh = valeur; };
            void Set_Di( double valeur ){ m_Di = valeur; };
     
            double HP( void ){ return m_HP; };
            double G( void ){ return m_G; };
            double AH( void ){ return m_AH; };
            double AV( void ){ return m_AV; };
            double Dh( void ){ return m_Dh; };
            double Di( void ){ return m_Di; };
    };
     
    /// Constructeur par défaut.
    CVisee::CVisee()
    {
        m_HP = 1.0;
        m_G  = 1.0;
        m_AH = 1.0;
        m_AV = 1.0;
        m_Dh = 1.0;
        m_Di = 1.0;
    }
     
    /// Constructeur par copie.
    CVisee::CVisee(CVisee const &)
    {
    }
     
    ///Surcharge d'opérateurs.
    CVisee CVisee::operator=(CVisee &src)
    {
        m_HP = src.HP();
        m_G  = src.G();
        m_AH = src.AH();
        m_AV = src.AV();
        m_Dh = src.Dh();
        m_Di = src.Di();
     
        return *this;
    }
     
    /// Destructeur.
    CVisee::~CVisee()
    {
    }
     
     
    /// Classe CStation
     
    class CStation
    {
        private:
            double      m_HT, m_G0;
     
        public:
            /// Initialisation d'une ligne de carnet.
            CStation();
            ~CStation();
     
            void Set_HT( double valeur ){ m_HT = valeur; };
            void Set_G0( double valeur ){ m_G0 = valeur; };
     
            double HT( void ){ return m_HT; };
            double G0( void ){ return m_G0; };
     
            void AjouterVisee( CVisee &visee );
     
            /// Toutes les visées à partir de cette station;
            std::list<CVisee> m_visees;
    };
     
    CStation::CStation()
    {
        m_HT = 0.0;
        m_G0 = 0.0;
    }
     
    CStation::~CStation()
    {
    }
     
    void CStation::AjouterVisee( CVisee &visee )
    {
        /// Ajout de la visée à la suite des autres.
        m_visees.push_back( visee );
    }
     
    /// Classe CCarnet.
     
    class CCarnet
    {
    	private:
            	std::list<CStation> m_carnet;
     
    	public:
            	CCarnet();
            	~CCarnet();
     
            	void AjouterStation( CStation &station );
                    void afficherContenu(),
     
    };
     
    CCarnet::CCarnet()
    {
    }
     
    CCarnet::~CCarnet()
    {
    }
     
    void CCarnet::AjouterStation( CStation &station )
    {
        m_carnet.push_back( station );
    }
     
    void CCarnet::afficherContenu()
    {
        std::list<CStation>::iterator station;
        int index = 0;
     
        /// Parcours de toutes les stations du carnet.
        for( station = m_carnet.begin(); station != m_carnet.end(); station++)
        {
            /// Affichage de la station.
            std::cout << ++index << (*station).HT() << (*station).G0();
     
            /// Affichage de la visée.
            std::list<CVisee>::iterator visee;
     
            for( visee = (*station).m_visees.begin(); visee != (*station).m_visees.end(); visee++)
            {
                std::cout << (*visee).HP() << (*station).HT() << (*visee).AH() << (*visee).AV() << (*visee).Di();
            }
        return true;
    }
     
     
    int main()
    {
     
        CCarnet am_carnet;
     
        CStation station;
        CVisee visee;
     
        station.Set_HT( 1.654 );
     
        visee.Set_HP( 1.300 );
        visee.Set_AH( 120.1892 );
        visee.Set_AV( 100.3835 );
        visee.Set_Di( 54.398 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.300 );
        visee.Set_AH( 383.2849 );
        visee.Set_AV( 99.2020 );
        visee.Set_Di( 53.580 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.500 );
        visee.Set_AH( 239.1023 );
        visee.Set_AV( 101.2292 );
        visee.Set_Di( 15.393 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.800 );
        visee.Set_AH( 13.4920 );
        visee.Set_AV( 98.2023 );
        visee.Set_Di( 5.495 );
        station.AjouterVisee( visee );
     
        am_carnet.AjouterStation( station );
        am_carnet.afficherContenu();
    }
    Désolé, je n'ai pas pu faire moins de 200 lignes.

    Merci.

  6. #6
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Niquel

    Dans ce bout de code le problème vient de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /// Constructeur par copie.
    CVisee::CVisee(CVisee const &)
    {
    }
    Tu redéfinis le constructeur par copie de la classe CVisee mais ce constructeur ne fait rien. Donc quand on arrive ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CStation::AjouterVisee( CVisee &visee )
    {
        /// Ajout de la visée à la suite des autres.
        m_visees.push_back( visee );
    }
    Le push_back ajoute une copie de visee dans la liste, donc il va construire un objet CVisee grâce au constructeur de copie, mais vu que ce constructeur ne fait rien, les variables membres ne sont pas copiés.


    Petit rappel, en C++ le compilateur génère automatiquement un constructeur par copie, un opérateur = et un destructeur correct dans les cas suivants :
    • Si la classe ne contient comme données membres que des types de base (int, float, double...).
    • Ou si la classe ne contient comme données membres que des types qui savent se copier eux-même (c.a.d dont le copy ctor et l'op= est définit, comme par exemple std::list, std::map, std::shared_ptr...).

    Pour le moment tes classes ne contiennent que des doubles et des std::list donc tu peux supprimer tous tes constructeur par copie, opérateur = et destructeur :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    #include <list>
    #include <iostream>
     
    /// Classe CVisee
     
    class CVisee
    {
        private:
            double m_HP, m_G, m_AH, m_AV, m_Dh, m_Di;
     
        public:
            CVisee();
     
            void Set_HP( double valeur ){ m_HP = valeur; };
            void Set_G( double valeur ){ m_G = valeur; };
            void Set_AH( double valeur ){ m_AH = valeur; };
            void Set_AV( double valeur ){ m_AV = valeur; };
            void Set_Dh( double valeur ){ m_Dh = valeur; };
            void Set_Di( double valeur ){ m_Di = valeur; };
     
            double HP( void ){ return m_HP; };
            double G( void ){ return m_G; };
            double AH( void ){ return m_AH; };
            double AV( void ){ return m_AV; };
            double Dh( void ){ return m_Dh; };
            double Di( void ){ return m_Di; };
    };
     
    /// Constructeur par défaut.
    CVisee::CVisee()
    {
        m_HP = 1.0;
        m_G  = 1.0;
        m_AH = 1.0;
        m_AV = 1.0;
        m_Dh = 1.0;
        m_Di = 1.0;
    }
     
     
    /// Classe CStation
     
    class CStation
    {
        private:
            double      m_HT, m_G0;
     
        public:
            /// Initialisation d'une ligne de carnet.
            CStation();
     
            void Set_HT( double valeur ){ m_HT = valeur; };
            void Set_G0( double valeur ){ m_G0 = valeur; };
     
            double HT( void ){ return m_HT; };
            double G0( void ){ return m_G0; };
     
            void AjouterVisee( CVisee &visee );
     
            /// Toutes les visées à partir de cette station;
            std::list<CVisee> m_visees;
    };
     
    CStation::CStation()
    {
        m_HT = 0.0;
        m_G0 = 0.0;
    }
     
     
    void CStation::AjouterVisee( CVisee &visee )
    {
        /// Ajout de la visée à la suite des autres.
        m_visees.push_back( visee );
    }
     
    /// Classe CCarnet.
     
    class CCarnet
    {
    	private:
            	std::list<CStation> m_carnet;
     
    	public:
            	void AjouterStation( CStation &station );
                void afficherContenu();
     
    };
     
     
    void CCarnet::AjouterStation( CStation &station )
    {
        m_carnet.push_back( station );
    }
     
    void CCarnet::afficherContenu()
    {
        std::list<CStation>::iterator station;
        int index = 0;
     
        /// Parcours de toutes les stations du carnet.
        for( station = m_carnet.begin(); station != m_carnet.end(); station++)
        {
            /// Affichage de la station.
            std::cout << ++index << " " << (*station).HT() << (*station).G0() << std::endl;
     
            /// Affichage de la visée.
            std::list<CVisee>::iterator visee;
     
            for( visee = (*station).m_visees.begin(); visee != (*station).m_visees.end(); visee++)
            {
                std::cout << (*visee).HP() << " " 
    			<< (*station).HT() << " " << (*visee).AH() << " " 
    			<< (*visee).AV() << " "<< (*visee).Di();
    			std::cout << std::endl;
            }
    		std::cout << std::endl;
    	}
     
    }
     
     
    int main()
    {
     
        CCarnet am_carnet;
     
        CStation station;
        CVisee visee;
     
        station.Set_HT( 1.654 );
     
        visee.Set_HP( 1.300 );
        visee.Set_AH( 120.1892 );
        visee.Set_AV( 100.3835 );
        visee.Set_Di( 54.398 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.300 );
        visee.Set_AH( 383.2849 );
        visee.Set_AV( 99.2020 );
        visee.Set_Di( 53.580 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.500 );
        visee.Set_AH( 239.1023 );
        visee.Set_AV( 101.2292 );
        visee.Set_Di( 15.393 );
        station.AjouterVisee( visee );
     
        visee.Set_HP( 1.800 );
        visee.Set_AH( 13.4920 );
        visee.Set_AV( 98.2023 );
        visee.Set_Di( 5.495 );
        station.AjouterVisee( visee );
     
        am_carnet.AjouterStation( station );
        am_carnet.afficherContenu();
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Super, ça fonctionne nickel

    Merci beaucoup.

    Petit rappel, en C++ le compilateur génère automatiquement un constructeur par copie, un opérateur = et un destructeur correct dans les cas suivants
    J'avais lu ça dans la FAQ du site et dans un bouquin et j'avais donc surchargé l'opérateur= car j'ai des types propres à mon programme et wxWidgets (du style wxString). En revanche, pour le constructeur par copie ne sachant pas quoi en faire je l'avais laissé vide en pensant que cela n'impacterait pas le programme.

    Merci.

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

Discussions similaires

  1. probleme imbrication des classes
    Par touane dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 04/12/2007, 15h14
  2. [POO] Imbrication de classes
    Par warrios dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2007, 00h11
  3. STL list : acceder aux enfant d'une class depuis un liste
    Par poussinphp dans le forum SL & STL
    Réponses: 6
    Dernier message: 29/04/2007, 17h21
  4. Imbrication de class
    Par themadmax dans le forum C++
    Réponses: 5
    Dernier message: 29/01/2006, 00h02
  5. [css]problème d'attribution de classe dans deux listes
    Par Mitaka dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 24/11/2005, 18h05

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