Bonjour voila, alors j'ai fait un peu de java, je connais un peu la poo, et c'est vrai qu'avec java, on ne s'embête jamais avec des pointeurs.
Je suis en train de suivre le tutoriel sur le c++, je viens d'arriver à la partie poo, et je viens d'observer un phénomène que je ne comprends pas.
//main.cpp
#include <iostream>
#include <string>
#include <ctime>
#include "Personnage.h"
#include "Weapon.h"
using namespace std;
int main()
{
Personnage david, goliath;
//Création de 2 objets de type Personnage : david et goliath
goliath.attack(david); //goliath attaque david
david.drinkHealthPotion(20); //david récupère 20 de vie en buvant une potion
goliath.attack(david); //goliath réattaque david
david.attack(goliath); //david contre-attaque... c'est assez clair non ?
goliath.getWeapon().change("Double hache tranchante veneneuse de la mort", 40);
goliath.attack(david);
cout << "David" << endl;
david.print();
cout << endl << "Goliath" << endl;
goliath.print();
return 0;
}
Si vous voulez que je vous mette les .h hésitez pas à demander.
Ma question c'est que lorsque j'écris goliath.getWeapon().change("Double hache tranchante veneneuse de la mort", 40); dans le main, et ben ça ne fait rien. Le cout juste après affiche toujours epee rouillee.
Mais si je remplace par goliath.changeWeapon("Double hache tranchante veneneuse de la mort", 40); , alors là miracle ça fonctionne. Le cout affiche bien le texte attendu. Pourtant, techniquement, ces deux fonctions font exactement la même chose. Alors je trouve ça incompréhensible.
Si quelqu'un peut m'expliquer les subtilités du c++ à cet égard... Ce serait très apprécié.
Je vous remercie d'avoir prit le temps de me lire.
Ces chapitres commettent une erreur de conception: une entité, cela ne doit pas se copier -- il faut `= delete`r constructeur de copie et d'affectation, et non définir des choses qui ne riment à rien. Cf fAQ pour trouver une première définition d'"entité".
Une fois ce problème réglé, il te restera à bien gérer les durées de vie en manipulant des `unique_ptr<>` pour les nouvelles entités en sorties de factories et celles stockées dans des attributs, directement ou indirectement (std::vector<std::unique_ptr<Arme>>). Et pour les signatures des autres fonctions, utiliser des références.
Je n'ai pas trop le temps de faire un cours complet là. Je laisse à d'autre le soin de renvoyer vers des références plus complètes.
//Main.cpp
(*goliath.getWeapon()).change("Double hache tranchante veneneuse de la mort", 40);
Ca fonctionne mais je trouve ces notations.. un peu lourdes. Il y a t-il un autre moyen de l'écrire ? Ou de procéder ?
De plus comme getWeapon() renvoie un pointeur désormais, je ne peux plus mettre le "const", mon IDE râle : impossible d'utiliser une valeur de type "const Weapon *" pour initialiser une entité de type "Weapon *"
Je ne peux pas écrire une fonction getWeapon const qui me renvoie une référence sur l'attribut b_weapon de ma classe personnage ?
//Personnage.h
#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE
#include <string>
#include <iostream>
#include "Weapon.h"
class Personnage
{
private :
int b_health;
int b_mana;
Weapon b_weapon;
public :
Personnage();
~Personnage();
Personnage(std::string name, int damage);
Personnage(Weapon weapon);
void getDamaged(int damage);
void attack(Personnage &target);
void drinkHealthPotion(int quantityPotion);
void changeWeapon(Weapon newWeapon);
void changeWeapon(std::string name, int damage);
bool isAlive() const;
Weapon* getWeapon() ;
void print();
};
#endif
Merci encore de me lire et pour vos réponses si rapides !
Il me semble qu'il y a une petite erreur ( d'inattention ? )ligne 16 dans ton exemple, XxAnothChaxX , tu as oublié le const pour la référence vers le integer m_nombre:
const int & MyClass::getNombre() const
{
return m_nombre;
}
Normalement, le compilateur renvoie une erreur si une fonction membre const renvoie une référence vers une variable membre non-const.
goliath.getWeapon().change("Double hache tranchante veneneuse de la mort", 40);
Mon ide indique une erreur sur l'objet goliath : l'objet a des qualificateurs de type incompatibles avec le membre fonction "Weapon::change" -- le type d'objet est : const Weapon
Ce "const" commence à me prendre la tète. Est-ce vraiment nécessaire de le mettre partout ? J'avais lu dans le tutoriel qu'il fallait mettre const tout ce qui pouvait l'être, mais je me pose la question : est-ce que ça vaut vraiment le coup ?
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr