Déjà :
i = i + 1 peut être remplacé par
i += 1 et par
i++ (tous font la même chose).
Prend l'habitude d'utiliser
i++, le code est beaucoup plus agréable et rapide à lire comme ça.
Omettons l'erreur du 'i' pour le moment.
Ce qui va arriver dans ta boucle c'est qu'à chaque
itération (c-à-d à chaque fois), tu vas créer un objet Personnage.
Or, en C++, une instance de classe (si tu viens de GM, comprends une instance d'objet) ou quelconque autre variable déclaré statiquement (donc comme tu le fais ici)
se détruira à la fin de sa scope (une scope est délimitée par les accolades '{}'). Bref, chaque nouveau personnage créé va être détruit à la fin de chaque itération de ta boucle.
Revenons sur l'erreur du i désormais :
int est un type
primitif et ne peut pas être
casté (converti vers un type) vers un std::string (classe de texte en C++) ou un char* ("série" de caractères en C - Toujours fonctionnel avec le C++ puisque le C++ est plus ou moins "rétrocompatible"), bref passons. Depuis le C++11 (une refonte majeure du langage C++ qui vient avec son lot de fonctionnalités très intéressantes), une nouvelle fonction std::to_strting a été implantée. Celle-ci permettra de faire ce que tu veux.
Le problème, c'est qu'il me semble que la version de MinGW actuelle utilisée par Code::Blocks (je présume que tu l'utilises) possède un bug qui rend l'utilisation de celle-ci impossible.
Du coup, je vais te donner ma propre fonction qui permettra de faire cela simplement. Celle-ci est plutôt lente, mais te conviendra amplement.
to_string.h
- Code:
-
#ifndef TOSTRING_H_INCLUDED
#define TOSTRING_H_INCLUDED
#include <sstream>
#include <string>
template<typename T>
std::string to_string(T data)
{
std::stringstream ss;
ss << data;
return ss.str();
}
#endif
Il est recommandé de placer son code au sein du .cpp et non pas du .h, mais en l’occurrence, ma fonction est une fonction dite
template (car on peut aussi bien y passer un int qu'un float : La fonction s'adapte au type voulu - c'est un concept très puissant, important et plutôt simple à appréhender du C++ et si tu passes sur l'IRC, oni ou D-z se fera une joie de te dire à quel point ils les adorent) : Le compilateur a besoin qu'on définisse la fonction ainsi.
Maintenons, nous voulons stocker chaque nouveau Personnage dans une liste pour les réutiliser facilement, car donner le nom joueur.i ne fonctionnera pas. Utilisons un std::vector qui conviendra parfaitement à la tâche.
Nous utiliserons sa méthode push_back pour ajouter chaque nouveau personnage.
On peut connaître la taille d'un std::vector avec sa méthode size et accéder à un de ses éléments avec des crochets, comme avec GM : monVector[5] par exemple.
Attention, essayer d'accéder à une valeur d'un tableau qui n'a pas encore été remplie te donnera une erreur "out of bounds". De même si tu essaies d'accéder à une case d'index négative.
- Code:
-
int main()
{
std::vector<Personnage> persos;
for (int i = 0; i < 10; i++)
{
Personnage nouveauPerso;
nouveauPerso.ecrireVie(); // Pourquoi en as-tu besoin? Ne peux-tu pas le faire dans le constructeur de Personnage, c-à-d Personnage::Personnage?
nouveauPerso.nomPerso("Joueur " + to_string(i));
persos.push_back(nouveauPerso); // Ceci n'est pas très efficace en termes de performances il me semble, mais ça suffira pour cet usage.
}
for (int i = 0; i < persos.size(); i++)
{
std::cout << persos[i].getNom() << std::endl; // N'oublie pas de créer une méthode getNom à Personnage
}
return 0;
}
Et hop là! Pense à demander sur IRC si tu as plus de questions.