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

Langage C++ Discussion :

[Langage] Modification d'une classe dans un vector


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut [Langage] Modification d'une classe dans un vector
    Bonjour,

    Je veux faire un petit jeux de strategie, un espece d'echec amélioré, sur un damier, avec des unités etc...
    J'ai une classe Grille, qui contient un vector de Case ainsi qu'une vector d'Unité déclarés en attribut dans la classe Grille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    include <vector>
    class Grille{
    private :
    std::vector<Case> v_case;
    std::vector<Unite> c_unite;
    public :
    .....
    };
    J'ai des méthodes de la classe Grille qui permettent d'accéder à mes cases et mes unités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    getCase(int i){
    return v_case[i];
    }
     
    getUnite(int i){
    return v_unite[i];
    }
    A partir de la j'ai des méthodes de ma classe Unite qui permettent logiquement de modifier certains attributs :

    Une unité a des HP, j'ai donc un attribut :

    Avec une méthode Attack() de la classe unité, je veux pouvoir attaquer une autre unité, ce qui va modifier ses HP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Attack(Unite &u){
    u.changeHP(-(this->getAttack()));
    }
    Je vous passe les détails sur mes fonctions changeHP et getAttack() elles sont assez explicites.

    A partir de là, voilà mon problème :

    Tant que je suis dans ma méthode Attack(), si je fais des tests en affichant les HP de la cible, il y a bien modification de ses HP. Mais en dehors de la méthode, si je veux afficher ses HP, ils n'ont pas changé.

    Pour régler ce problème faut-il qu'à la place de mes vectors d'Unite et de Case je fasse des vectors de pointeur vers Unite et vers Case ?
    Dernière modification par Invité ; 17/12/2008 à 16h28.

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    getUnite(int i){
    return v_unite[i];
    }
    Il manque le type de retour.

    Je pense qu'il faut que tu renvoies des références, et que ce n'est pas ce que tu fais .

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui je me suis trompé effectivement sur mon message, mais dans mon code je spécifie le type de retour qui est dans le cas de cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Unite Grille::getUnite(int i){
    return v_unite[i];
    }

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Comme dit précédemment, si tu dois modifier l'élément en retour, il te faut renvoyer une référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Unite& Grille::getUnite(int i){
    return v_unite[i];
    }

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Effectivement, il te faut renvoyer une référence. Pourquoi?
    Explication:

    Prenons une classe Dum qui possède une variable membre X de type entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Dum
    {
    public:
       Dum( int x ) : X(x) {} //constructeur
       int GetX() { return X;} //GetX() renvoie une copie de X!! 
    private:
       int X;
    };
    Maintenant un exemple de code qui utilise un objet de type Dum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dum d(1); //crée un objet Dum avec X=1
    int x=d.GetX(); // x est une copie de d.X
    x++; //incrémente x, mais pas d.X
    C'est pour cela que si GetX() renvoie non plus une copie de X, mais une référence sur X, alors x=d.GetX() ne sera plus une copie de X, mais une référence sur d.X et alors tu pourras le modifier.

    Cela dit, ton problème met en évidence une erreur de conception, ou au moins de sémantique. En effet, un accesseur (GetX dans mon exemple) est fait pour récupérer une variable membre, et ne doit pas permettre de le modifier, sinon ton encapsulation devient un peu bancale, d'autant plus lorsque la variable en question est dans un conteneur (ce qui est ton cas ici).

    Hope it helps.

  6. #6
    Invité
    Invité(e)
    Par défaut
    D'accord tout s'explique, c'est peut être une erreur de conception mais au moins j'ai compris !
    Merci beaucoup pour l'explication en tous les cas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment insérer une classe dans un vector
    Par razily dans le forum SL & STL
    Réponses: 9
    Dernier message: 26/02/2010, 18h55
  2. Récupérer un Vector d'une classe dans une autre
    Par javamax dans le forum Langage
    Réponses: 2
    Dernier message: 22/10/2006, 13h29
  3. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 14h12
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

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