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 :

[POO] Modifier un attribut depuis le main


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut [POO] Modifier un attribut depuis le main
    Bonjour !

    je suis en train de réaliser une sorte de mini mini mini RPG et j'ai quelque soucis, j'essaye de faire en sorte que ce soit l'utilisateur qui fasse intéragir mes personnages (Bruce et Chuck).
    Seulement voilà:
    • J'ai fait un tuto au début (tres cours), mais a la fin du tuto je souhaite remettre la vie de mon personnage blessé au maximum. Mais je crois que la regle d'encapsulation me l'interdit, j'ai donc fait un getm_vie(), mais ca ne semble pas fonctionner.
    • Y a t-il moyen de rendre les commande moins lourde, car.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      cin << choix;
      if(choix == "bruce boire potion")
      {
            bruce.boirepotion(20);
      }
      if(choix == "chuck boire potion")
      {
           chuck.boirepotion(25); // Favoritisme :pp
      }
      if(choix == bruce attaquer chuck")
      {
           bruce.attaquer(Chuck);
      }
      Enfin vous avez compris, c'est pas super pratique



    Voilà mon code entier:
    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
    33
    34
    35
    36
    #include <iostream>
    #include <string>
    #include "Personnage.h"
     
    using namespace std;
     
     
    int main()
    {
        //Variable
        string choixtuto;
        // Création des personnages
        Personnage Bruce, Chuck("Epée aiguisée", 20, "Chuck");
     
        cout << "Bruce et Chuck sont dans l'arene ! Que souhaitez vous faire ?" << endl;
        cout << "TUTO: Selectionnez le personnage a utiliser, ensuite une action (boire potion, attaquer, lancer sort)" << endl;
        cout << "TUTO: Commencez par faire en sorte que Chuck attaque Bruce" << endl;
        cin >> choixtuto;
     
        if(choixtuto == "Chuck attaquer Bruce" || "chuck attaquer bruce")
        {
            chuck.attaquer(bruce);
            cout << "Bien joue, vous pouvez aussi afficher l'etat de votre personnage avec le nom suivis de etat, exemple: bruce etat" << endl;
            cout << "Amusez vous bien !" << endl;
            bruce.getm_vie() = 100;
        }
        else
        {
            cout << "Non, ce n'est pas ca ! Essayez: 'Chuck attaquer Bruce'" << endl;
            cin >> choixtuto;
        }
     
     
     
        return 0;
    }

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Le mieux est de faire une fonction perso.restaure() qui restaure tous les points de vie du personnage.
    D'un point de vue syntaxique, tu peux aussi avoir le getter getm_vie() qui te retourne une référence pour pouvoir modifier directement la vie du personnage. Si tu fais ça, autant mettre l'attribut vie en public...

    Pour simplifier ton code, tu peux utiliser les références:
    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
    cin << nom;
    cin << action;
    cin << cible; // Si tu as une seule string, tu peux la découper avec un std::strinstream, ou avec boost (ou à la main)
     
    Personnage & perso = (perso == "bruce") ? bruce : chuck; // Il faut faire une fonction au lieu d'utiliser ce if bizarre, en plus cette fonction est appelée autre part
     
    if (action == "boire")
    {
        if (cible == "potion") { perso.boirepotion(); }
    }
    else if (action == "attaquer")
    {
        Personnage & perso_cible = (cible == "bruce") ? bruce : chuck;
        perso.attaquer(perso_cible);
    }
    Sinon, fait attention à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage Bruce, Chuck("Epée aiguisée", 20, "Chuck");
    car c'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage Bruce; // Appel du constructeur par défaut
    Personnage Chuck("Epée aiguisée", 20, "Chuck");

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De manière générale, il faut absolument éviter autant que possible de comparer des chaines de caractères pour une raison toute simple : ce genre de comparaison est, par nature, excessivement lente.

    De plus, cela oblige le joueur à introduire exactement la chaine de caractères que tu attends, ce qui implique que la moindre faute de frappe (une lettre oubliée, par exemple) enverra ton programme dans les choux... et je ne parle pas des actions qui ne sont simplement pas prévues

    L'idée serait plutôt de faire une sorte de menu dans lequel tu indiquerais toi même l'action que le joueur peut effectuer associée à un numéro d'ordre, et à demander à l'utilisateur d'introduire le numéro de l'action qu'il envisage.

    Ca prendrait, par exemple, la forme de
    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
    void afficheMenu()
    {
        std::cout<<"1 - Chuck frappe Bruce"<<std::endl
                 <<"2 - Bruce frappe Chuck"<<std::endl
                 <<"3 - Chuck boit potion"<<std::endltt
                 <<"4 - Bruce boit potion"<<std::endl
                 <<" les autres possibilites s'il y en a ;)"<<std::endl;
                 <<"0 - Quitter "<<std::endl
                 <<"    Introduisez votre choix (0 - X)"; 
    }
    int choisirAction()
    {
        int choix = -1; // pour être sur d'entrer une fois dans la boucle
        while(choix >=0 && choix <=4) // pour l'instant, on a 4 possibilités ;)
        {
            afficherMenu();
            cin>>choix;
            if(choix < 0 || choix > 4)
            {
                std::cout<<"veuillez introduire une valeur comprise entre 1 et 4"
                         <<std::endl;
            }
        } 
        return choix;
    }
    Le tout serait utilisé sous une forme proche de
    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
    int main()
    {
       /* ce qu'il faut d'initialisation ;) */
        int choix = -1; // pour être sur de passer une fois dans la boucle
        while(choix != 0) // 0 c'est quitter ;)
        {
            choix= choisirAction();
            switch (choix)
            {
                case 1 : // "Chuck frappe Bruce" ;)
                    /* ce qu'il faut faire */
                    break;
                case 2 : // "Bruce frappe Chuck"
                    /* ce qu'il faut faire */
                    break;
                case 3 : //"Chuck boit potion"
                    /* ce qu'il faut faire */
                    break;
                case 4 : //"Bruce boit potion"
                    /* ce qu'il faut faire */
                    break;
                default : //" 0- Quitter"
                    std::cout<<"Merci d'avoir utilise ce merveilleux jeux, a bientot";
     
            }
            /* finalisation et "nettoyage" */
            return 0;
        }
    }
    Citation Envoyé par Ehonn Voir le message
    D'un point de vue syntaxique, tu peux aussi avoir le getter getm_vie() qui te retourne une référence pour pouvoir modifier directement la vie du personnage.
    Quelle horreur, non, surtout pas, malheureux!!

    On ne peut jamais (*) renvoyer une référence non constante sur un accesseur !!!

    C'est le meilleur moyen de perdre tout à fait le controle sur le membre renvoyé et d'arriver très facilement à s'étonner que la valeur ne soit pas celle à laquelle on s'attend

    (*) sauf pour quelques cas particuliers dans lesquels la classe ne sert que de "helper", comme les classes "itérateur" (non constant), car ce genre de classe est "simplement" destiné à "chacher" la structure interne réelle d'une autre classe
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par koala01 Voir le message
    De manière générale, il faut absolument éviter autant que possible de comparer des chaines de caractères pour une raison toute simple : ce genre de comparaison est, par nature, excessivement lente.
    Cet argument ne s'applique pas vraiment ici. Il y a une saisie utilisateur.
    Pour la sécurité contre les fautes de frappe, j'ai proposé de fournir des constantes (mais toujours des strings).
    Si tu demandes à l'utilisateur de taper des numéros, ça change le gameplay.

    ---

    Citation Envoyé par koala01 Voir le message
    Citation Envoyé par Ehonn Voir le message
    D'un point de vue syntaxique, tu peux aussi avoir le getter getm_vie() qui te retourne une référence pour pouvoir modifier directement la vie du personnage.
    Quelle horreur, non, surtout pas, malheureux!!

    On ne peut jamais (*) renvoyer une référence non constante sur un accesseur !!!

    C'est le meilleur moyen de perdre tout à fait le controle sur le membre renvoyé et d'arriver très facilement à s'étonner que la valeur ne soit pas celle à laquelle on s'attend

    (*) sauf pour quelques cas particuliers dans lesquels la classe ne sert que de "helper", comme les classes "itérateur" (non constant), car ce genre de classe est "simplement" destiné à "chacher" la structure interne réelle d'une autre classe
    Tu as coupé ma citation !

    Citation Envoyé par Ehonn Voir le message
    D'un point de vue syntaxique, tu peux aussi avoir le getter getm_vie() qui te retourne une référence pour pouvoir modifier directement la vie du personnage. Si tu fais ça, autant mettre l'attribut vie en public...
    J'ai bien précisé que c'était valide sur le plan syntaxique. Et la dernière phrase dit que ça brise les règles d'encapsulation. J'aurais pu être un petit peu plus explicite.

    Autres exceptions: tous les conteneurs

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Cet argument ne s'applique pas vraiment ici. Il y a une saisie utilisateur.
    Pour la sécurité contre les fautes de frappe, j'ai proposé de fournir des constantes (mais toujours des strings).
    Si tu demandes à l'utilisateur de taper des numéros, ça change le gameplay.
    Ca change peut etre le game play mais ca le rend, d'une certaine manière, bien plus agréable à l'utilisateur.

    Et, surtout, ca prend en compte le fait que l'origine de tous les bugs se trouve entre la chaise et le clavier (autrement dit, que l'utilisateur doit être considéré par défaut comme un imbécile distrait )

    J'ai d'ailleurs passé ce point sous silence dans le code, mais il faudrait prévoir de valider le fait que l'entrée utilisateur est bel et bien une valeur numérique
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ca change peut etre le game play mais ca le rend, d'une certaine manière, bien plus agréable à l'utilisateur.

    Et, surtout, ca prend en compte le fait que l'origine de tous les bugs se trouve entre la chaise et le clavier (autrement dit, que l'utilisateur doit être considéré par défaut comme un imbécile distrait )
    Raison de plus pour lui pourrir la vie avec un gameplay en carton XD
    Vengeance !

  7. #7
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Bonjour et merci a vous deux.

    Vos explications ont vraiment été tres clair et j'ai appris pas mal de truc, nottament que si je ne comprends pas tes scripts Ehonn, c'est car (je pense) qu'ils sont trop simplifiés pour moi, et le code ne me parrait pas du tout familier et je m'y perd ^^.

    Sinon koala01, merci pour ces clarifications, ainsi que cet méthode, j'avoue que je n'aurais pas eu l'idée de le faire comme ca moi même, j'ose esperer que j'aurais ce genre d'habitude plus tard.

    Je vais donc continuer mon programme, merci beaucoup.

  8. #8
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Personnage.h
    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
     
            class Personnage {
            public:
                    //Création du perso
                    Personnage( std::string nom ) : nom( nom ), force( 5 ), vie( 20 ) {}
                    //Revoyer les valeurs
                    std::string Nom() { return nom; }
                    const int Vie() { return vie; }
                    //Agir
                    void RecoitDegat( const int degats ) { vie -= degats; }
                    void DonneCoup( Personnage& p ) { p.RecoitDegat( force ); }
     
            private:
                    std::string nom;
                    int force;
                    int vie;
            };
    Scénario :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Personnage bruce( "Bruce" ), chuck( "Chuck" );
            std::cout << "Nom du perso : " << bruce.Nom() << ". Sa vie : " << bruce.Vie() << std::endl;
            while( bruce.Vie() > 0 ) {
                    chuck.DonneCoup( bruce );
                    std::cout << "Bruce n'a plus que " << bruce.Vie() << std::endl;
            }
            std::cout << "Bruce est mort." << std::endl;
    Ne passe pas par des strings pour tes comparaisons, généralement les fonctions sont faites pour cela, au pire il y a les enum

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Ne passe pas par des strings pour tes comparaisons, généralement les fonctions sont faites pour cela, au pire il y a les enum
    ?

    Au passage, un peu de "chipotage" ^^
    Citation Envoyé par PilloBuenaGente Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Revoyer les valeurs
    std::string Nom() { return nom; }
    const int Vie() { return vie; }
    //Agir
    void DonneCoup( Personnage& p ) { p.RecoitDegat( force ); }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Revoyer les valeurs
    std::string const & Nom() const { return nom; }
    int Vie() const { return vie; }
    //Agir
    void DonneCoup(Personnage & p) const { p.RecoitDegat(force); }

  10. #10
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Envoyé par PilloBuenaGente Voir le message
    Ne passe pas par des strings pour tes comparaisons, généralement les fonctions sont faites pour cela, au pire il y a les enum
    Oula oui je ne me comprends même pas.
    Le if( choix == string ) n'est pas vraiment approprié, utilise :
    soit des fonctions différente, au lieu de trier le choix dans une seule fonction.
    soit des enum puis un switch :
    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
            enum {
                    FRAPPER,
                    MORDRE,
                    TUER
            };
     
            int action = FRAPPER;
     
            switch( action ) {
            case FRAPPER:
                    frapper;
                    break;
            case MORDRE:
                    mordre;
                    break;
            }
    std::string const & Nom() const { return nom; }
    Permet d'éviter la copie ?! Surtout si la string est grande ?!

  11. #11
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Une fois de plus merci de vos réponses (je dois vous donner plein de boulot :pp).

    @PilloBuenaGente:
    -Tu peux m'expliquer precisement enum ? Et pourquoi avec fait int action ?
    -Ce code affiche le nom et la vie du perso, et frappe bruce a mort c'est ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Personnage bruce( "Bruce" ), chuck( "Chuck" );
            std::cout << "Nom du perso : " << bruce.Nom() << ". Sa vie : " << bruce.Vie() << std::endl;
            while( bruce.Vie() > 0 ) {
                    chuck.DonneCoup( bruce );
                    std::cout << "Bruce n'a plus que " << bruce.Vie() << std::endl;
            }
            std::cout << "Bruce est mort." << std::endl;
    @Ehonn:
    -Super idée la fonction .
    -En revanche j'ai du mal a saisir les references.
    Pour moi une reference c'est ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string adresse("escalope");
    string& adresseSecrete(adresse);
    cout << "vous habitez dans une " << adresse << endl;
    cout << "Oui, dans une " << adresseSecrete << endl;
    J'utilise donc par exemple dans mon Personnage.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void attaquer(std::string Personnage &cible, int nBdegats);
    {
          cible.m_vie -= nBdegats;
    }
    Mais n'ayant pas définis cible je ne pige pas :/. (J'ai recup le script sur le tuto que je fais)

  12. #12
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Tu peux m'expliquer precisement enum ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    enum {
       nom1,//Égal à 0
       nom2,//Égal à 1
       nom3//Égal à 2
       ....
    }
    Permet de remplacer des chiffres par des noms de variable, sert juste à mieux s'y retrouver.
    Ce code affiche le nom et la vie du perso, et frappe bruce a mort c'est ca ?
    C'est bien ça !
    Et pourquoi avec fait int action ?
    Dans ce cas il ne sert à rien... Tu peux en effet mettre directement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    switch( FRAPPER ) { 
    }

  13. #13
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    J'ai juste un petit soucis.
    Quel est le meilleur moyen d'afficher le nom de l'objet concerner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Personnage::attaquer(Personnage &cible) // En gros je souhaiterais afficher cet argument
    {
           cible.recevoirDegats(35);
                cout << m_nomPersonnage << " frappe "  << endl; // Je voudrais l'afficher là
            }

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Le mieux est de surcharger l'opérateur << entre un flux et un personnage, ce qui te permettra d'écrire std::cout << m_nomPersonnage << " frappe " << cible << std::endl;.
    FAQ C++ - Comment utiliser les flux pour afficher ou saisir mes objets ?

    Mais ici, si tu veux afficher uniquement le nom du personnage, tu peux te contenter de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << m_nomPersonnage << " frappe " << cible.nomPersonnage() << std::endl;

  15. #15
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Merci ! Mais quand je met ca ca affiche cet erreur:

    In member function 'void Personnage::lancerSort(int, Personnage&)'
    |58|error: no match for call to '(std::string {aka std::basic_string<char>}) ()'|
    ||=== Build finished: 1 errors, 0 warnings (0 minutes, 1 seconds) ===|

    Extrait du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Personnage::lancerSort(int sortfeu, Personnage &cible)
    {
            if(sortfeu == 1 && m_mana >= 50)
            {
                cible.recevoirDegatsMagique(35);
                m_mana -= 50;
                cout << m_nomPersonnage << " lance un sort de feu de 35 de degats pour 50 de magie sur " << cible.m_nomPersonnage() << endl;
            }
            else
            {
                cout << "Vous n'avez pas assez de mana une fois";
            }
    }
    J'ai encore du mal a me familiariser avec les objets, j'espere que je finirais par tout comprendre

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

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Lorsque j'ai écrit cible.nomPersonnage() j'ai supposé que tu avais un getter sur m_nomPersonnage dans la classe Personnage qui s'apellait nomPersonnage().

    Voici le code du getter en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string const & Personnage::nomPersonnage() const
    { return m_nomPersonnage; }
    Comme tu définis une fonction membre de la classe Personnage, tu as le droit d'écrire directement cible.nomPersonnage, mais c'est déconseillé. Il faut mieux passer par le getter.

  17. #17
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Ce n'est pas que ce soit déconseillé, c'est complètement à l'encontre de l'essence même des classes.

    Les classes sont une évolution des structs pour répondre au besoin d'encapsulation.

    Le membre a tout intérêt à être privé tandis que l'accesseur constant (const string & nom() const;) sera public.
    Ainsi, nulle fonction ne pourra modifier le nom du personnage, sauf si c'est une méthode de personnage, justement.

    D'ailleurs, puisqu'il s'agit de la classe personnage, il n'est pas utile de nommer la fonction nom_personnage(), on le sait déjà:
    personnage.nom() est assez clair, personnage.nom_personnage() est redondant.

  18. #18
    Membre confirmé
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2009
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2009
    Messages : 67
    Par défaut
    Bon j'avais eu un soucis mais j'ai réussis a le résoudre.
    Merci c'était simple et une fois de plus je n'y est pas pensé ^^.
    Vous gerez !

    Pour l'encapsulation j'ai fait un getm_nom, avec un std::string (je précise parce que j'avais mis void au début, du coup avec le return a la fin il a pas aimé :p)

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

Discussions similaires

  1. [POO] Modifier un attribut du style sous Internet Explorer
    Par julien_mok dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/11/2008, 23h55
  2. Réponses: 6
    Dernier message: 30/10/2007, 15h04
  3. [POO] Modifier attributs d'un objet par référence
    Par justSam dans le forum Langage
    Réponses: 8
    Dernier message: 22/02/2007, 07h58
  4. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01
  5. [VBA-E]modifier les attributs d'un commentaire dans une cellule
    Par Olivier vb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/03/2004, 10h26

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