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 :

Cr�ation d'un tableau en objet qui int�gre d'autres valeurs de tableau. Ouf !


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2016
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Par d�faut Cr�ation d'un tableau en objet qui int�gre d'autres valeurs de tableau. Ouf !
    Bonjour tout le monde,

    J'ai un petit soucis sur mon code. J'ai cr�� un classe Personnage dans laquelle j'ai impl�ment� deux constructeurs :
    - 1 avec des valeurs par d�fauts,
    - l'autre avec des valeurs d�finies par l'utilisateur.

    Jusqu'ici, je pense que tout va bien. Pour comprendre voici mon code concernant la classe Personnage :
    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
     
    #include "Personnage.h"
    #include <iostream>
    #include <string.h>
    #include <istream>
    #include <vector>
     
    using namespace std;
     
    Personnage::Personnage(vector<string> nom): m_arme(0), m_armeSac(0), m_vie(100), m_mana(100)
    {
        m_arme = new Arme();
        m_armeSac = new Arme();
     
    }
     
    Personnage::Personnage(vector<string> nom, vector<string> nomArme, vector<int> degatsArme) : m_arme(0), m_armeSac(0), m_vie(100), m_mana(100)
    {
        m_arme = new Arme(nomArme, degatsArme);
        m_armeSac = new Arme(nomArme, degatsArme);
    }
    Dans mon main(), je demande � l'utilisateur de cr�er le nom de ses perso, de choisir des armes qu'il affecte � chaque perso. Pour cela, j'ai opt� pour la cr�ation de tableaux en utilisant vector.
    J'ai donc :
    - un vector<string> avec le nom des Perso entr�s par le User,
    - un vector<string> avec les armes affect�es par le User,
    - un vector<int> pour les d�g�ts correspondant aux armes affect�es.

    L'id�e est de rassembler tous ces �l�ments dans un objet qui, lui-m�me, serait un tableau. OUF, j'ai r�ussi � tout expliquer.

    Voici l'ensemble de mon main() =
    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
    int main()
    {
     
        int nbrePersoACreer=0;
        int validChoix;
        int num=0;
     
        vector<string> nomPerso;
        vector<string> armePerso;
        vector<int> degatsArme;
     
        // Demander de créer des personnages
     
        while(nbrePersoACreer<1 || nbrePersoACreer>4){
           cout << "Créer vos personnages" << endl << endl;
           cout << "Pour le moment, 4 combattants maximum !!!" << endl;
           cout << "Combien de personnages voulez-vous créer : ";
           cin >> nbrePersoACreer;
        }
     
        do{
        num=0;
        nomPerso.clear(); // efface l'ensemble des données du tableau.
            for (int i=1 ; i <= nbrePersoACreer ; i++){
                num++;
                string nom;
                cout << "Entrez le nom du personnage n° " << num << " : ";
                cin >> nom;
                nomPerso.push_back(nom);
            }
     
            cout << "" << endl;
     
            cout << "Voici les " << nbrePersoACreer << " noms des personnages choisis : " << endl;
            num=0;
     
            for (int i=0; i < nbrePersoACreer ; i++){
                num++;
                cout << "Personnage " << num << " : " << nomPerso[i] << endl;
            }
     
            cout << "" << endl;
            cout << "Voulez-vous conserver les noms de personnages ?" << endl;
            cout << "Choix 1 : c'est ok," << endl;
            cout << "Choix 2 : Finalement, les noms sont merdiques, je change !" << endl;
            cout << "Vas-y mec, choisi : ";
            cin >> validChoix;
            cout << "" << endl;
     
         }while(validChoix != 1 && validChoix == 2);
     
             cout << "" << endl;
     
     
       // Choisir une arme pour chaque personnage
     
        cout << "Choississez une arme pour chaque personnage : " << endl;
        cout << "choix 1 : épée (degats 10)" << endl;
        cout << "choix 2 : sabre (degats 10)" << endl;
        cout << "" << endl;
        num=0;
     
        do{
        num=0;
        armePerso.clear(); // efface l'ensemble des données du tableau.
        degatsArme.clear(); // efface l'ensemble des données du tableau.
     
            for (int i=0; i < nbrePersoACreer ; i++){
                num++;
                int arme;
                cout << "Personnage " << nomPerso[i] << " : ";
                cin >> arme;
                    if (arme = 1){
                        armePerso.push_back("épée");
                        degatsArme.push_back(10);
                    }
                    if (arme = 2){
                        armePerso.push_back("sabre");
                        degatsArme.push_back(10);
                    }
            }
     
            cout << "" << endl;
     
            cout << "Voici les armes affectées pour les " << nbrePersoACreer << " personnages : " << endl;
            num=0;
     
            for (int i=0; i < nbrePersoACreer ; i++){
                num++;
                cout << "Personnage " << nomPerso[i] << " : " << armePerso[i] << " (degats " << degatsArme[i] << ")" << endl;
            }
     
            cout << "" << endl;
            cout << "Voulez-vous valider l'affectation des armes ?" << endl;
            cout << "Choix 1 : c'est ok," << endl;
            cout << "Choix 2 : Finalement, je change !" << endl;
            cout << "Vas-y mec, choisi : ";
            cin >> validChoix;
            cout << "" << endl;
     
         }while(validChoix != 1 && validChoix == 2);
     
         /*créer l'objet Personnage en utilisant les valeurs tapées par l'utilisateur
         et stockées dans mes différents tableaux.*/
     
        // Début de piste :
     
        Personnage *tabPerso[nbrePersoACreer];
     
        tabPerso[nbrePersoACreer] = new Personnage(nomPerso, armePerso, degatsArme);
     
        tabPerso[0]->afficheEtat();
     
        return 0;
     
    }
    J'espere que mes explications sont suffisamment claires pour trouver une personne qui pourra m'aider. Attention, je ne suis pas un developpeur chevronn� ou averti. Donc je suis preneur d'explications abordables pour un n�ophyte.

    Ai-je fait le bon choix pour le stockage de mes valeurs ? N'y a-t-il pas plus simple pour stocker les valeurs entr�es par le User et ensuite les affecter � mon Constructeur Personnage ?

    Bref, je suis fan de tous les conseils qui pourront me faire avancer.

    PS : Ne faites pas attention � la s�curisation de mon code car je n'ai pas encore travaill� dessus.

    Mille Mercis

  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 : 51
    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
    Il y a quelques points dans ton code que je ne comprends pas (et peut-�tre que toi non plus ). Donc voici une liste de remarques questions :
    - Pourquoi passer un vector<string> comme nom d'un personnage ? Il n'a qu'un nom, n'est-ce pas ?
    - M�me question pour l'arme : Il semblerait qu'il n'en a qu'une, pourquoi passer des vectors ?
    - Plut�t que de passer des string + d�g�ts au constructeur de personnage, vu que tu as visiblement une classe arme quelque part, pourquoi ne pas lui passer directement une arme pr�existante ?
    - Pour d�signer un pointeur nul, nullptr est plus clair que 0.
    - Tu utilises des vector, c'est tr�s bien, mais pourquoi ne pas faire de m�me pour tabPerso ?
    - Ton code de saisie des arme code en dur deux armes existantes. Le jour o� tu voudras en ajouter (soit dans le code, soit par fichier de configuration), tu devras modifier de code qui va vite devenir tr�s r�p�titif. Je te propose de partir vers l'approche suivante :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    vector<Arme> armesMagasin {{"Epée", 10}, {"Sabre", 10}, {"Nunchaku", 5}}; // On pourrait le charger dans un fichier
    for (Arme : armesMagasin)
    {
      // Affiche l'arme, précédée d'un nombre, d'une lettre ou de tout autre identifieur
    }
    // Demande à l'utilisateur l'arme
    Il y a je pense plein d'autres choses � am�liorer dans le code, mais je crois que �a constitue d�j� une premi�re base d'am�lioration.

    PS : Je n'ai pas compris ce que tu appelles s�curisation du code. Tu veux dire la protection contre de mauvaise entr�es de la part de l'utilisateur ?
    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
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2016
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Par d�faut Reponse JolyLoic
    Voici mes r�ponses � la suite de tes questions/remarques :
    - Pourquoi passer un vector<string> comme nom d'un personnage ? Il n'a qu'un nom, n'est-ce pas ? -> Non, en fait, si tu regardes en d�tail, je propose � l'utilisateur de cr�er entre 1 � 4 perso. C'est pour cela que j'ai d�cid� de choisir vector pour stocker les diff�rents noms choisis par le User.
    Voici l'extrait du code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    for (int i=1 ; i <= nbrePersoACreer ; i++){
                num++;
                string nom;
                cout << "Entrez le nom du personnage n° " << num << " : ";
                cin >> nom;
                nomPerso.push_back(nom);
            }
    - M�me question pour l'arme : Il semblerait qu'il n'en a qu'une, pourquoi passer des vectors ? -> Alors pour l'arme, je suis d'accord avec toi sur le fait que pour le moment, je pourrai probablement me passer d'un vector �tant donn� que les valeurs (�p�e,...) sont en dures. Cela dit, l'id�e �tait de pouvoir, par la suite, proposer � l'utilisateur de cr�er ses propres armes. Donc du coup, le choix du vector me permettrait de stocker ses cr�ations d'arme dans un tableau.

    - Plut�t que de passer des string + d�g�ts au constructeur de personnage, vu que tu as visiblement une classe arme quelque part, pourquoi ne pas lui passer directement une arme pr�existante ? -> Il existe d�j� une arme pr�existante dans ma classe Arme. Mais je voulais plut�t utiliser le deuxi�me constructeur Arme, qui n'utilise pas les valeurs par d�faut.
    extrait du code de la classe Arme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Arme::Arme(){
     
        m_nom = "pierre";
        m_degats = 2;
     
    }
     
    Arme::Arme(string nom, int degats){
     
        m_nom = nom;
        m_degats = degats;
     
    }
    - Pour d�signer un pointeur nul, nullptr est plus clair que 0 -> je ne comprends pas trop ta proposition car pour le moment, dans mon main, je n'ai pas encore utilis� de pointeur. J'ai tent� de cr�er un pointeur *tabPerso qui rassemble les valeurs cr�er par le User (nomPerso, armePerso, DegatsArme), mais le probl�me, c'est que je n'arrive pas � utiliser mon tabPerso.
    Exemple (probablement faux) :
    Personnage tabPerso[0](qui rassemble mon vector<string>nomPerso[0], mon vector<string>armePerso[0], et mon vector<int> degatsArme).
    Ensuite, j'utilise ma m�thode pour afficher tout cela :
    tabPerso[0].afficherEtat().
    Voil� en gros l'objectif.

    - Tu utilises des vector, c'est tr�s bien, mais pourquoi ne pas faire de m�me pour tabPerso ? -> La r�ponse est donn�e en grande partir ci-dessus.

    PS : Je n'ai pas compris ce que tu appelles s�curisation du code. Tu veux dire la protection contre de mauvaise entr�es de la part de l'utilisateur ? -> Oui, c'est �a.

  4. #4
    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 : 51
    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
    Citation Envoy� par f0x888 Voir le message
    Voici mes r�ponses � la suite de tes questions/remarques :
    - Pourquoi passer un vector<string> comme nom d'un personnage ? Il n'a qu'un nom, n'est-ce pas ? -> Non, en fait, si tu regardes en d�tail, je propose � l'utilisateur de cr�er entre 1 � 4 perso. C'est pour cela que j'ai d�cid� de choisir vector pour stocker les diff�rents noms choisis par le User.
    Voici l'extrait du code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    for (int i=1 ; i <= nbrePersoACreer ; i++){
                num++;
                string nom;
                cout << "Entrez le nom du personnage n° " << num << " : ";
                cin >> nom;
                nomPerso.push_back(nom);
            }
    Oui, j'ai bien vu que tu as 4 personnages, mais chaque personnage n'a qu'un nom. Tu dois donc avoir un vector<Personnage>, mais le Personnage n'a besoin en param�tre du constructeur que d'une string, pas d'un vector<string>.
    Citation Envoy� par f0x888 Voir le message

    - M�me question pour l'arme : Il semblerait qu'il n'en a qu'une, pourquoi passer des vectors ? -> Alors pour l'arme, je suis d'accord avec toi sur le fait que pour le moment, je pourrai probablement me passer d'un vector �tant donn� que les valeurs (�p�e,...) sont en dures. Cela dit, l'id�e �tait de pouvoir, par la suite, proposer � l'utilisateur de cr�er ses propres armes. Donc du coup, le choix du vector me permettrait de stocker ses cr�ations d'arme dans un tableau.
    L� encore, j'ai peur qu'il y ait confusion entre les armes existant globalement, et les armes poss�d�es par un personnage en particulier.
    Citation Envoy� par f0x888 Voir le message
    - Plut�t que de passer des string + d�g�ts au constructeur de personnage, vu que tu as visiblement une classe arme quelque part, pourquoi ne pas lui passer directement une arme pr�existante ? -> Il existe d�j� une arme pr�existante dans ma classe Arme. Mais je voulais plut�t utiliser le deuxi�me constructeur Arme, qui n'utilise pas les valeurs par d�faut.
    extrait du code de la classe Arme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Arme::Arme(){
     
        m_nom = "pierre";
        m_degats = 2;
     
    }
     
    Arme::Arme(string nom, int degats){
     
        m_nom = nom;
        m_degats = degats;
     
    }
    �a n'emp�che pas. L�, pour cr�er un personnage, tu fais :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Personnage conan("Conan", "Epée en acier de Crom", 100); // L'arme est crée à l’intérieur du constructeur de personnage
    Je te propose de remplacer �a par :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Arme epeeCrom("Epée en acier de Crom", 100);
    Personnage conan("Conan", epeeCrom);
    Citation Envoy� par f0x888 Voir le message

    - Pour d�signer un pointeur nul, nullptr est plus clair que 0 -> je ne comprends pas trop ta proposition car pour le moment, dans mon main, je n'ai pas encore utilis� de pointeur.
    Dans ton main, non, mais dans ton constructeur de personnage, quand tu �cris m_arme(0).

    Citation Envoy� par f0x888 Voir le message

    J'ai tent� de cr�er un pointeur *tabPerso qui rassemble les valeurs cr�er par le User (nomPerso, armePerso, DegatsArme), mais le probl�me, c'est que je n'arrive pas � utiliser mon tabPerso.
    Exemple (probablement faux) :
    Personnage tabPerso[0](qui rassemble mon vector<string>nomPerso[0], mon vector<string>armePerso[0], et mon vector<int> degatsArme).
    Ensuite, j'utilise ma m�thode pour afficher tout cela :
    tabPerso[0].afficherEtat().
    Voil� en gros l'objectif.

    - Tu utilises des vector, c'est tr�s bien, mais pourquoi ne pas faire de m�me pour tabPerso ? -> La r�ponse est donn�e en grande partir ci-dessus.
    Par moment, on a l'impression que ta classe Personnage d�crit un personnage, mais par d'autres moments, on a l'impression qu'elle devrait les d�crire tous. Par exemple, dans ta phrase pr�c�ente, tu dis que tabPerso[0] rassemble vector<string>nomPerso[0]], c'est � dire un �l�ment du vecteur, une simple string, pas le vecteur complet ! Ce qui rejoint le premier point.
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2016
    Messages
    4
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Par d�faut Reponse
    Ok, je te remercie d'avoir pris le temps de consulter mon code. Je vais prendre en compte l'ensemble des tes recommandations afin de simplifier mon code et voir ce que je peux faire pour �viter d'avoir � g�rer tous mes vector...

    Par cons�quent, je place le topic en r�solu, et si j'ai des difficult�s, je reviendrai � la charge...

    En tout cas, merci de ta r�activit� et bon dimanche.

  6. #6
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Pour compl�ter (et peut �tre t'aider � mieux comprendre) la r�action de JolyLoic.

    Tu es d'accord que chaque personnage a un et un seul nom et une et une seule arme. Que tu cr�es 1, 5, 10 ou ... 150 personnages, cela restera le cas.

    D�s lors, tu peux demander � l'utilisateur de cr�er autant de personnage que tu le souhaites (attention, il faudra peut �tre voir � �viter les doublons au niveau du nom du personnage, car, si tu en as deux qui s'appelle MickeyMouse, tu auras sans doute du mal � choisir lequel est attaqu� ou lequel boit sa potion de mana ), et l'une des solutions, pendant l'�tape de cr�ation peut effectivement passer par le fait de placer les informations introduites par l'utilisateur dans un tableau.

    Mais l'id�e, une fois que l'utilisateur a cr�� tous les personnages qu'il voulait, c'est de cr�er tous les personnages en une fois. Et donc, tu pourrais tr�s bien avoir un code proche de
    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
     
    // j'aime énormément vérifier que la logique qui a mené à un certain point du programme
    // soit vérifiée, de manière à traquer les erreurs dues à mon inattention
    // il faut donc avoir le même nombre d'armes que de personnages
    assert(nomPerso.size() == armePerso.size() && "nombre d'armes inconsistant");
    // et il faut avoir introduit des dégats pour chaque arme
    assert(armePerso.size() == degatsArme.size() && "nombre de degats inconsistant");
    // Maintenant que l'on sait que chaque personnage a une arme et que chaque arme dispose d'un nombre de dégats
    // on peut créer les différents personnages sous une forme proche de
    std::vector<Personnage> tousLesPersos; // on le nomme comme on veut, du moment qu'on sait à quoi il sert 
    for(size_t i=0; i<nomPerso.size(); ++1){  // j'aurais pu choisir armePerso.size() ou degatsArme.size() vu qu'on sait que 
                                                                     // les trois tableau ont la même taille
        Personnage tmp{nomPerso[i],armePerso[i], degatsArmes[i]); // pour chaque perso créé, il ne faut que l'arme et les dégats qui lui correspondent
        tousLesPersos.push_back(tmp); // on le rajoute dans la liste des personnages existants
    }
    ou, pour que le constructeur ne prenant que le nom de ton personnage puisse servir, nous pourrions imposer le fait qu'une chaine vide et un nombre de d�gats �gal � 0 provoquera la cr�ation d'une arme "par d�faut". Nous pourrions alors modifier ce code pour lui donner une forme proche de
    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
     
    // j'aime énormément vérifier que la logique qui a mené à un certain point du programme
    // soit vérifiée, de manière à traquer les erreurs dues à mon inattention
    // il faut donc avoir le même nombre d'armes que de personnages
    assert(nomPerso.size() == armePerso.size() && "nombre d'armes inconsistant");
    // et il faut avoir introduit des dégats pour chaque arme
    assert(armePerso.size() == degatsArme.size() && "nombre de degats inconsistant");
    // Maintenant que l'on sait que chaque personnage a une arme et que chaque arme dispose d'un nombre de dégats
    // on peut créer les différents personnages sous une forme proche de
    std::vector<Personnage> tousLesPersos; // on le nomme comme on veut, du moment qu'on sait à quoi il sert 
    for(size_t i=0; i<nomPerso.size(); ++1){  // j'aurais pu choisir armePerso.size() ou degatsArme.size() vu qu'on sait que 
                                                                     // les trois tableau ont la même taille
        if(armePerso[i].empty()){ // si la chaine de caractères représentant l'arme est vide
            // ma logique a-t-elle bien fait attention au fait que, si la chaine de caractères représentant l'arme est vide,
            // le nombre de dégats DOIT est égal à 0 ???
            assert(degatsArme[i]== 0 && "valeur de degats inconsistante avec une l'arme par defaut");
            Personnage tmp{nomPerso[i]); // pour chaque perso créé, il ne faut que l'arme et les dégats qui lui correspondent
            tousLesPersos.push_back(tmp); // on le rajoute dans la liste des personnages existants
        }else{
            Personnage tmp{nomPerso[i],armePerso[i], degatsArmes[i]); // pour chaque perso créé, il ne faut que l'arme et les dégats qui lui correspondent
            tousLesPersos.push_back(tmp); // on le rajoute dans la liste des personnages existants
       }
    }
    Maintenant, les quelques remarques habituelles :
    • using namespace std; ne devrait pas �tre utilis� dans un code r�cent. Cette possibilit� avait �t� donn�e � l'�poque de la standardisation pour permettre � la base de code qui existait � l'�poque de continuer � fonctionner "sans trop de modification" quand la biblioth�que standard a d�cid� de faire passer tout son contenu dans l'espace de noms std... Mais cela date de pr�s de 18 ans, maintenant!!!
    • Tu as de magnifiques fuites m�moires, parce que tu recours � l'allocation dynamique de la m�moire � de nombreuses occasions, et que tu en manipule le r�sultat avec des pointeurs nus
    • Pourquoi n'afficher l'�tat que du premier personnage, et non celui de tous les autres (ligne 112)
    • On ne d�clare pas toutes les variables au d�but de la fonction : on les d�clare le plus pr�s possible de la premi�re utilisation qui en est faite
    • On utilise de pr�f�rence la liste d'initialisaiton dans les constructeurs
    • L'allocation dynamique de la m�moire n'est vraiment utile que dans certaines circonstances (besoin de profiter du polymorphisme d'inclusion), qui ne sont pas (encore) d'application pour ton projet-->elle n'a donc aucun int�r�t pour l'instant, en plus de provoquer des catastrophes au vu de la mani�re dont tu l'utilise
    • Une fonction de 120 lignes (et plus), c'est une fonction qui en fait beaucoup trop. La r�gle est simple concernant les fonction : pour chaque objectif, il faut une fonction qui ne s'occupe que de ca. Ici, tu as les objectifs suivants:
      1. demander � l'utilisateur le nombre de personnages qu'il veut cr�er (lignes 14 � 19)
      2. demander � l'utilisateur le nom des personnages qu'il veut cr�er (lignes 24 � 30)
      3. afficher les noms des personnage (lignes 34 � 40)
      4. proposer de changer le nom des personnages (lignes 42 � 48)
      5. permettre � l'utilisateur de choisir l'arme de chaque personnage (ligne 57 � 82)
      6. afficher les armes qui seront affect�es � chaque personnage (ligne 83 � 91)
      7. proposer de changer les armes des personnages (lignes 91 � 99)
      8. cr�er les personnages et afficher leur �tats (devraient normalement �tre consid�r� comme deux responsabilit� distinctes ) le reste du code
      9. faire fonctionner l'application (l'ensemble de la fonction main)
    Si j'ai bien compt�, cela fait donc que ta fonction main s'occupe de dix choses diff�rentes, prend dix responsabilit�s diff�rentes. C'est 9 de trop. Tu devrais donc avoir 9 fonctions de plus qui s'occupe chacune d'un aspect bien particulier
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Affecter une valeur � un tableau d'objets
    Par Christophe Genolini dans le forum Collection et Stream
    R�ponses: 2
    Dernier message: 05/08/2013, 13h39
  2. R�ponses: 1
    Dernier message: 12/04/2010, 16h49
  3. [PHP 5.3] array dans un objet qui est lui meme dans un tableau d'objet
    Par mfej74 dans le forum Langage
    R�ponses: 4
    Dernier message: 11/12/2009, 11h56
  4. [d�butant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    R�ponses: 5
    Dernier message: 09/01/2007, 18h07
  5. Cr�ation d'un tableau d'objet
    Par chronos7 dans le forum ActionScript 1 & ActionScript 2
    R�ponses: 3
    Dernier message: 03/05/2006, 12h05

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