Problèmes de pointeurs en POO sur un programme C++

a marqué ce sujet comme résolu.

Bonjour, J’ai un souci de pointeurs en POO sur un programme en C++. J’ai créé un programme un peu RPG avec deux personnages de tapent dessus, mais le problème c’est qu’au lieu d’envoyer la valeur de leurs stats, ils envoient l’adresse de leurs stats. :euh:

#include <iostream>
#include <string>
#include <random>
using namespace std;

class Perso
{
    private:
        int attaque;
        int degats;
        int armureTronc;
        int casque;
        int endurance;

    public:
        void attaquer(int att, int deg, Perso def);
        void defendre(int deg, int protec, int endurance, int part);
        int *getAtt();
        int getTete();  //Ces deux là ne servent à rien,
        int getTronc();//mais je les garde au cas où
        int *getEndur();
        int *getDeg();
        Perso();
        Perso(int attaque, int degats, int armureTronc, int casque, int endurance);
};

int *Perso::getAtt()
{
    return &attaque;
}
int *Perso::getDeg()
{
    return &degats;
}
int *Perso::getEndur()
{
    return &endurance;
}
void Perso::defendre(int deg, int protec, int endurance, int part)
{
    if(deg > protec)
    {
        cout << "Protection insuffisante, dégâts subis : " << deg - protec << endl;
        endurance += protec;
        endurance -= deg;
        if(endurance <= 0)
        {
            cout << "Le personnage attaqué est mort sur ce coup. Le combat est terminé.";
            exit(1);
        }
    } else {
        cout << "Le coup n'est pas assez puissant." << endl;
    }
}
void Perso::attaquer(int att, int deg, Perso def)
{
    if(rand()%100 + 1 < att)
    {
        cout << "Attaque reussie" << endl;
        if(rand()%100 + 1 < 50)
        {
            cout << "Dégâts sur le tronc :" << endl;
            int subis = deg + rand()%10 + 1;
            cout << "Résultat du jet de dé : " << subis - deg << endl;
            cout << subis << " dégâts" << endl;
            def.defendre(subis, def.armureTronc, def.endurance, 1);
        } else {
            cout << "Dégâts a la tête :" << endl;
            int subis = deg + rand()%10 + 1;
            cout << "Résultat du jet de dé : " << subis - deg << endl;
            cout << subis << " dégâts" << endl;
            def.defendre(subis, def.casque, def.endurance, 2);
        }
    } else {
        cout << "Attaque echouée" << endl;
    }
}

Perso::Perso()
{}
Perso::Perso(int attaque, int degats, int armureTronc, int casque, int endurance)
{}

int main()
{
    srand((unsigned int)time(0));
    Perso paladin(40, 4, 5, 4, 12);
    Perso orc(30, 5, 5, 5, 12);
    int test = 0;
    
    //for(int i = 0; i < 3; i++)//while(test == 0)
    //La boucle for sert a tester le combat, et si tout marche, on remplace par la while qui sert à le faire durer jusqu'à la mort d'un des deux combattants. Mais il faut d'abord régler le problème des adresses
    /*{
        paladin.attaquer(*(paladin.getAtt()), *(paladin.getDeg()), orc);
        cout << endl;
        orc.attaquer(*(orc.getAtt()), *(orc.getDeg()), paladin);
        cout << endl;
    }*/
    
    cout << "Niveau d'attaque de orc : " << *(orc.getAtt()) << endl << "Niveau de degats de orc : " << *(orc.getDeg()) << endl << "Niveau d'endurance de orc : " << *(orc.getEndur()) << endl;
    
    return 0;
}

//Huh, Huston, we have a problem...  ^^'
//Vous y comprenez quelque chose vous ?

Voilà, merci d’avance pour l’aide. ^^

+0 -0

Salut,

J’ai un peu de mal à comprendre ta question. Tu dis que les fonctions getAtt et autres renvoient des adresses plutôt que des valeurs de stats.

Mais si ce n’est pas le comportement que tu souhaitais, pourquoi avoir indiqué int* comme type de retour à ces fonctions et utilisé l’opérateur & qui permet justement de récupérer l’adresse d’une variable ?

Que cherches-tu à faire dans le fond, pouvoir utiliser ces méthodes get... pour modifier la valeur de la statistique plus tard ? Ça me paraît un peu tordu comme manière de fonctionner.
Tu pourrais mettre ça en place plus facilement avec des références, mais est-ce vraiment ce que tu veux ?

Bonjour,

Ce que tu peux faire par ordre décroissant d’intérêt

int Perso::getAtt()const  // pas une bonne idée, tu rends accessible une donnée interne et son type. Et demain si l'attaque n'est plus un simple entier?
int const& Perso::getAtt()const // moins bien ici, mais si le type était plus "gros" cela permettrait des optimisations
int& Perso::getAtt() // permet en plus de modifier l'attaque, mais ça n'est pas une bonne idée
int const* Perso::getAddrAtt()const // comme la référence, mais plus lourd à utiliser et laisse à penser que le pointeur pourrait être nul
int* Perso::getAddrAtt() // le summum, tous les inconvénients précédents réunis

Tu peux aussi utiliser simultanément les cas 2 et 3 ou aussi pour les cas 4 et 5 (l’accès à un objet constant donneras utilisera 2/4, l’accès à un objet modifiable considéreras 3/5.) Tu as choisi le dernier! Utiliser le premier serait "bien moins pire" mais peut-être que la structuration que tu envisages est fragile.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte