AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [Résolu]Id ou nom différents pour chaque élément objet d'une class C++

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
arglow
Bavard
avatar

Messages : 108
Projet Actuel : Empereur

MessageSujet: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   Lun 2 Nov 2015 - 16:37

Salut à tous,

Je continue mon laborieux apprentissage du Langage C++.

J'ai désormais compris comment créer une class y ajouté des fonctions.

Là ou maintenant j'essaye de pousser le truc c'est la génération "automatique" d'objet et leur gestion.
Je m'explique :

Code:
#include <iostream>
#include <string>
#include "Personnage.h"

using namespace std;

int main()
{
    Personnage joueur;
    joueur.ecrireVie();
    joueur.nomPerso("Florian");
    joueur.nomPerso("Jean");

    //joueur.ecrireVie();
    return 0;
}

Il est trés simple de créer un objet joueurA, joueurB, etc quand c'est tapé dans le code directement et d'en manipuler les informations vie, nom, etc.

Maintenant imaginons que je veuille générer automatiquement des object (par exemple pour créer en automatique des ennemis) comment faire.

J'ai essayer par exemple de créer des objets avec une boucle for  du style :

Code:
#include <iostream>
#include <string>
#include "Personnage.h"

using namespace std;

int main()
{

for(int i = 0; i<10; i=i+1){
    Personnage joueur.i;
    joueur.i.ecrireVie();
    joueur.i.nomPerso(i);//ça donne une erreur bien sur puisque j'essaye de passer un int dans un string mais peu importe c'est pour comprendre l'idée de génération automatique d'objet
}    
    return 0;
}

Mais visiblement cela ne fonctionne pas ainsi.
J'ai essayé de diverses manières sans succès je pense que je me trompe dans la logique.

Pouvez vous m'aider svp.
Merci
Florian


Dernière édition par arglow le Lun 2 Nov 2015 - 17:59, édité 1 fois
Revenir en haut Aller en bas
http://www.edooc.fr
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   Lun 2 Nov 2015 - 17:20

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.
Revenir en haut Aller en bas
arglow
Bavard
avatar

Messages : 108
Projet Actuel : Empereur

MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   Lun 2 Nov 2015 - 17:46

Big Thanks Soudii.

Plus pédagogique que ça difficile à faire.

Il me manque quelques notions de bases pour tout comprendre mais j'ai des pistes d'approfondissement notamment les Vector, va falloir que je potasse le truc. Idem pour les template qui est un concept que je n'ai pas encore abordé dans mon apprentissage.

En tout cas vraiment je te remercie pour tout le temps consacré à me répondre le plus simplement possible.
Florian
Revenir en haut Aller en bas
http://www.edooc.fr
onilink_
Modérateur
avatar

Messages : 8918
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   Lun 2 Nov 2015 - 19:59

Pour de bonnes perfs quand on ajoute un élément dans un vector faut utiliser emplace_back. Mais bon on sent la différence que quand les éléments sont vraiment lourds...
Puis en C++11 y a la sémantique move qui permet de s'en passer sans pertes de perfs (si on implémente un move constructor).

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   

Revenir en haut Aller en bas
 
[Résolu]Id ou nom différents pour chaque élément objet d'une class C++
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Les différents types de tocs
» Les différents niveaux d'évolution Spirituelle
» Les différents types de fixations de tissages
» [Les différents armements dans la Marine] Pour changer, si l'on parlait canons...
» avoir accès aux différents thèmes de discussions...?

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: