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

  1. #1
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 27
    Par défaut Comment lire un vecteur crée depuis le constructeur d'une classe dans une fonction membre de la même classe ?
    Bonjour la communauté,

    le constructeur de ma classe Partie génère un vecteur (unVecteur) qui contient des éléments.
    dans le main, j'instancie Partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main()
    {
    Partie unePartie();
    //...
    return 0;
    }
    A ce stade, unePartie dispose de unVecteur

    Puis toujours depuis le main, j'appelle la fonction membre sequence()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main()
    {
    Partie unePartie();
    unePartie.sequence();
    //...
    return 0;
    }
    Or là, si je fais dans sequence()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << unVecteur.size();
    j'ai un vecteur de taille 0 !
    Apparemment un problème de portée avec ce unVecteur...
    Comment faire dans sequence() pour que le vecteur unVecteur crée par le constructeur soit "manipulable" (lecture de unVecteur[i], unVecteur.push_back(), etc) ?

    DSL de sécher sur un truc aussi basique.
    Rick

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 158
    Billets dans le blog
    4
    Par défaut
    le constructeur de ma classe Partie génère un vecteur
    Kamoulox. Un constructeur ne génère rien, il n'a pas de valeur de retour.

    - où se trouve le code de partie ?
    - comment deviner l'utilisation de unVecteur ?
    - ce code ne compile pas, Partie unePartie(); devrait émettre au moins un warning parce que c'est la syntaxe du prototype d'une fonction sans paramètre qui retourne un Partie.
    - as-tu déjà lu un cours de C++ ? Si oui, faudrait recommencer parce que tu sembles avoir loupé les premiers chapitres.
    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 averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 27
    Par défaut
    Certes le constructeur ne retourne rien mais il initialise les variables de l'objet instancié non ?
    Dans l’ordre inverse des questions :
    -Oui j’ai lu un (des) cours de C++ et certes 100 fois sur métier etc.
    - Le code compile sans warning (Code::Block 17 12 et mingw32-g++.exe)

    DSL, je pensais avoir été clair quoique synthétique ; ce n’est pas le cas je détaille donc ci après (note, les fichiers sont nettoyés du superflus pour la clarté de l’exercice) :
    Le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "../Header_perso/Partie.h"
    using namespace std;
     
    int main()
    {
        unsigned int tourJoue=0;
        Partie unePartie;
        tourJoue=unePartie.sequence();
        return tourJoue;
    }
    Partie.h
    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
     
    #ifndef PARTIE_H
    #define PARTIE_H
     
    #include <iostream>
    #include <string>
    #include <vector>
     
    class Partie
    {
    public:
     
    //Constructeur
        Partie();
     
    //Accesseurs
     
    // Methodes
        int initialise(std::vector <Armee> &listArmee);
        int sequence();
     
     
    private:
     
    //Attributs (membres)
     
        std::string m_camp[7]; //nom des camps du jeu
        bool m_enJeu[7]; //si true le camp est en jeu, si false le camp est hors jeu
        std::vector <Armee> listArmee; // contient les armées en jeu
    };
     
    #endif // PARTIE_H
    Comme la class Partie instancie des objets de la classe Armee.
    voici donc Armee.h :
    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
     
    #ifndef ARMEE_H_INCLUDED
    #define ARMEE_H_INCLUDED
     
    #include <string>
    #include <vector>
     
    class Armee // définit la classe Armée
    {
    public:
     
    // Constructeur
        Armee(int villeDattache, int camp, int noArmee, int curHex);
     
    // Accesseurs
        int getVille(); //retourne le n° de la ville d'attache (LiCo)
        int getPiquier(int no); // retourne les infos sur les piquiers de l'armée no -> (nb, att, def)
        int getHexActuel(); // retourne le no de l'hexagone où se trouve l'armee
        int getCamp() const; // retourne le camp de l'armée
     
    // Méthodes
        int setPiquier(int nb, int att, int def); // affecte l'armée du nombre de piquiers avec att et def
        void setCamp(int camp); // affecte un camp à l'armee
        void setMoral(int moral); // affecte un moral à l'armee
        void setHexActuel(int hex); // affecte hex au no de l'hexagone où se trouve l'armee
     
    private: // Attribut (membres)
     
        int m_villeDattache; //n° de la ville dans lVille de création de l'armée
        int m_camp;
        int m_noArmee;
        int m_curHex; // n° de l'hexagone ou se trouve l'armee
        int m_piquier[3]; // nombre [0], Att [1] et Def [2] des unités de Piquiers de l'armée    
    };
     
    #endif // ARMEE_H_INCLUDED
    Et enfin, partie.cpp :
    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
    #include "../Header_perso/Armee.h"
    #include "../Header_perso/Partie.h"
    
    //Constructeur
    Partie::Partie()
    {
        for(int i(0); i<7; i++) m_enJeu[i]=false;
    
        std::vector <Armee> listArmee;
    
        initialise(listArmee) ;
         
    }
    
    //Methodes
    Partie::initialise(std::vector <Armee> &listArmee) // initialise la partie à instancier
    {
        m_camp[0]="d'Argent";
        m_camp[1]="d'or";
        m_camp[2]="d'Azur";
        m_camp[3]="de Gueule";
        m_camp[4]="de Sable";
        m_camp[5]="de Vair";
        m_camp[6]="d'Hermine";
    
    
    // camp en jeu pour la partie test
        m_enJeu[0]=true;
        m_enJeu[2]=true;
        m_enJeu[2]=true;
        m_enJeu[6]=true;
    
    //liste des garnisons pour la partie test
    
        Armee armee_dargent(302,0,1,302);
        armee_dargent.setPiquier(1,1,1);
        listArmee.push_back(armee_dargent);
    
        Armee armee_dazur(412,2,1,401);
        armee_dazur.setPiquier(1,1,1);
        listArmee.push_back(armee_dazur);
    
        Armee armee_desable(1001,4,1,1012);
        listArmee.push_back(armee_desable);
        armee_desable.setPiquier(1,1,1);
    
        Armee armee_dhermine(1112,6,1,1102);
        armee_dhermine.setPiquier(1,1,1);
        listArmee.push_back(armee_dhermine);
    }
    
    Partie::sequence()
    {
        unsigned int tour=1;
        bool fini=false;
        while (!fini)
        {
        //deroulé de la séquence de jeu
            // calcul des point d'armée disponibles pour chaque camp
            for(int i(0); i<7; i++)
            {
                if(m_enJeu[i])
                {
                    for(unsigned int j(0); j<listArmee.size(); j++) // <= c’est là que ça coince listArme.size() vaut 0 et non 4
                    {
                        // fait des trucs
                    }
                }
            }
    
            // demande si Tour suivant
            std::string reponse;
            std::cout << "un tour de plus ? ";
            std::cin >> reponse;
            std::cout << std::endl;
            if (reponse=="n" or reponse=="N") break;
            tour++;
        }
        return tour;
    }
    Oualà, j'ai tout mis (sauf Armee.cpp, mais le code d'implémentation des fonctions membres de Armee.h fonctionne sans pb).
    Je ne vois pas pourquoi ça pêche pour ce vecteur listArmee...
    Rick.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 600
    Par défaut
    Bonour,

    La ligne 9 de partie.cpp crée un variable locale de même nom que le membre. Il faut supprimer cette ligne 9!

  5. #5
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juillet 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 27
    Par défaut
    Citation Envoyé par dalfab Voir le message
    (...) Il faut supprimer cette ligne 9!
    Effectivement c'était bien ça, je passe donc ce sujet en "résolu".

    MERCI !
    Rick.

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

Discussions similaires

  1. Instancier une classe fille depuis le constructeur de la classe mère
    Par austin57 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 15/11/2017, 23h24
  2. Comment lire(et modifier) la base de registres d'une machine locale(ou distante)?
    Par punto dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 22/11/2008, 17h00
  3. Réponses: 5
    Dernier message: 27/08/2008, 16h29
  4. Réponses: 1
    Dernier message: 01/08/2008, 21h12
  5. Réponses: 4
    Dernier message: 11/05/2007, 20h45

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