AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le deal à ne pas rater :
Aliexpress : codes promo valables sur tout le site
Voir le deal

 

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

Aller en bas 
3 participants
AuteurMessage
arglow
Bavard
arglow


Messages : 108
Projet Actuel : Empereur

[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ Empty
MessageSujet: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   [Résolu]Id ou nom différents pour chaque élément objet d'une class C++ EmptyLun 2 Nov 2015 - 17: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 - 18:59, édité 1 fois
Revenir en haut Aller en bas
http://www.edooc.fr
Asu
Utilisateur confirmé: Rang ****
Asu


Messages : 895

[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ Empty
MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   [Résolu]Id ou nom différents pour chaque élément objet d'une class C++ EmptyLun 2 Nov 2015 - 18: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
arglow


Messages : 108
Projet Actuel : Empereur

[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ Empty
MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   [Résolu]Id ou nom différents pour chaque élément objet d'une class C++ EmptyLun 2 Nov 2015 - 18: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
onilink_


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

[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ Empty
MessageSujet: Re: [Résolu]Id ou nom différents pour chaque élément objet d'une class C++   [Résolu]Id ou nom différents pour chaque élément objet d'une class C++ EmptyLun 2 Nov 2015 - 20: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).

_________________
[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ Runningpotato1[Résolu]Id ou nom différents pour chaque élément objet d'une class C++ TvF6GED [Résolu]Id ou nom différents pour chaque élément objet d'une class C++ MdetltS
Revenir en haut Aller en bas
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
[Résolu]Id ou nom différents pour chaque élément objet d'une class C++
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Résolu] C++ probleme avec class ultra simple ...
» Assigner un chemin pour chaque instance d'un objet
» [Résolu] Pointer un élément de la view ?
» chaque seconde un objet tombe :gnii:
» Aide pour différents trucs en GML

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