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'objets dans une boucle


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Recherche d'orientation
    Inscrit en
    Juillet 2013
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Recherche d'orientation

    Informations forums :
    Inscription : Juillet 2013
    Messages : 91
    Points : 57
    Points
    57
    Par défaut Création d'objets dans une boucle
    Bonjour !

    Je suis en train de suivre un tutoriel (SdZ) pour apprendre à programmer en C++. Nous avons créer une classe Personnage et une autre Arme (sans importance ici).
    Je voudrais qu'au début du programme, le nombre de personnages/de joueurs soit saisi et qu'ensuite ceux-ci soient créés.
    Je pensais faire une boucle for mais ne voit pas comment créer les objets dedans (d'autant plus qu'ils seront détruits à la fin de la boucle). J'ai pensé aux vectors mais ne vois pas comment faire. J'ai essayé ceci mais ai 1 erreur et 3 notes :
    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
    #include <iostream>
    #include <string>
    #include <vector>
    #include "Personnage.h"
     
    using namespace std;
     
    int main()
    {
        int i,nbJoueurs;
        string nomPersonnage;
     
        cout<<"<--------------------- Jeu de combats magiques --------------------->"<<endl<<endl;
     
        do
        {
            cout<<"Nombre de joueurs : ";
            cin>>nbJoueurs;
        }while(nbJoueurs<2);
     
        vector<Personnage> tabJoueurs;
     
        for(i=0;i<nbJoueurs;i++)
        {
            cout<<"Nom du joueur : ";
            cin>>nomPersonnage;
            Personnage* joueur = new Personnage(nomPersonnage);
            tabJoueurs.push_back(joueur);
        }
     
        return 0;
    }
    avec :Nom : C++_new.png
Affichages : 1289
Taille : 12,0 Ko

    De plus, j'ai trouvé cela sur internet. Je ne connais pas encore new ni l'astérique après le type Personnage...

    Je vous remercie par avance de votre aide !

    AdelineJ

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Cela désigne les pointeurs.
    Un pointeur stocke l'adresse mémoire d'une autre variable, et new alloue une variable dans une partie extérieure de la mémoire (le tas).
    Pour l'instant, tu ne sembles pas en avoir besoin, donc je te laisse le temps d'y arriver.
    Tu as un peu de temps avant d'en avoir besoin.
    Sache que le pointeur à base de new et d'étoile n'est pas la meilleure solution. En général, on préfèrera les "smart pointers" tels que std::unique_ptr.



    Par contre, c'est une erreur du tuto, enlève les, simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage *joueur = new Personnage(nomPersonnage);
            tabJoueurs.push_back(joueur);
    devient alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage joueur = Personnage(nomPersonnage);
            tabJoueurs.push_back(joueur);
    en utilisant le constructeur immédiatement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage joueur(nomPersonnage);
            tabJoueurs.push_back(joueur);
    et en ne créant pas de variable locale pour rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabJoueurs.push_back(Personnage(nomPersonnage));
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Et en utilisant la fonction membre .emplace_back(...) (disponible dès C++11) qui prend directement les paramètres du constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabJoueurs.emplace_back(nomPersonnage);

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Je l'avais oublié, celui-là
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    [HS]un peu étrange quand même de faire un tuto sur SDZ et poster sur DVP.[/HS]
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 044
    Points : 2 239
    Points
    2 239
    Par défaut
    Salut,

    Tu as déclaré un std::vector contenant des Personnages et pas des pointeurs sur des personnages. Or tu push_back un pointeur sur un personnage.
    Donc soit tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<Personnage> tabJoueurs;
    tabJoueurs.push_back(Personnage(nomPersonnage));
    Soit tu fais (note le std::vector de pointeur de personnage):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<Personnage*> tabJoueurs;
    tabJoueurs.push_back(new Personnage(nomPersonnage));
    Attention pour la deuxième solution, tu ne dois pas oublier de delete avec l'opérateur du même nom chaque instance que tu alloues avec new.
    Homer J. Simpson


Discussions similaires

  1. [MySQL] Création de variables dans une boucle et récupération de données avec une requête
    Par lavande4 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/09/2008, 11h10
  2. Création d'objets dans une boucle for
    Par urban_p dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/06/2008, 10h34
  3. Création d'instance dans une boucle ?
    Par stabe dans le forum C#
    Réponses: 15
    Dernier message: 03/01/2008, 16h48
  4. probleme de création de variable dans une boucle
    Par misterweb dans le forum Langage
    Réponses: 2
    Dernier message: 16/01/2007, 19h21
  5. [FLASH MX] Créer un objet dans une boucle
    Par alexfrere dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 30/04/2006, 01h35

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