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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 153
    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 153
    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 599
    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 599
    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, 22h24
  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, 16h00
  3. Réponses: 5
    Dernier message: 27/08/2008, 15h29
  4. Réponses: 1
    Dernier message: 01/08/2008, 20h12
  5. Réponses: 4
    Dernier message: 11/05/2007, 19h45

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