Something went wrong in C++ [Solved]

Démarré par Linking13, 27 Février 2012 à 16:43

0 Membres et 1 Invité sur ce sujet

27 Février 2012 à 16:43 Dernière édition: 27 Février 2012 à 17:38 par Linking13
Plop!

J'ai dis il y a déjà quelques temps de cela que je comptais redevenir plus actif sur ZS, et comme il n'est jamais trop tard... Je me ramène - tel un gros profiteur - pour demander de l'aide en C++.

Voilà le problème : il y a trop de grilles pains. J'ai un mini projet en C++ à rendre dans 3 semaines (rien de bien pressé, donc). Grosso modo, le but de ce projet est de nous faire bosser sur les classes. Je n'ai normalement pas trop de problèmes à ce niveau. Enfin, normalement.

On nous demande de créer une classe Arme(nom de l'arme, puissance, coups restant), ainsi qu'une classe Personnage(nom du perso, race du perso, santé du perso, arme du perso).

Mon constructeur pour Arme marche à priori correctement - mais je poste tout de même sa définition :

Arme(const std::string &nom="Epee rouillee", const int degat=0, const int duree=0){_nomArme=nom; _ptDegat=degat; _duree=duree;};

Pour ce qui est du constructeur de ma classe Personnage, par contre, apparemment, ça déconne.

// dans le .h
Personnage(std::string &nom, std::string &type, int sante, Arme &arme);

// dans le .cpp
Personnage::Personnage(std::string &nom, std::string &type, int sante, Arme &arme){
   _nomPerso=nom;
   _typePerso=type;
   _santePerso=sante;
   _armePerso=arme;
}


En somme, lorsque j'essaie de faire ceci dans mon prog principal :

Arme master_sword("Excalibur", 15, 50);
Personnage Link("Link", "Hylien", 50, master_sword);


Ben ça ne fonctionne pas, le compilateur refuse, et me balance ça :

error: no matching function for call to 'Personnage::Personnage(const char [5], const char [7], int, Arme&)'

J'ai aussi créé un constructeur sans paramètres pour ma classe personnage. Lorsque je déclare dans mon prog principal "Personnage Link", là, par contre, ça marche correctement. Par contre, si je déclare "Personnage Link("Link", "Hylien", 50)" (donc, que je ne lui assigne pas d'arme, de sorte qu'il devrait normalement avoir l'arme par défaut), ça ne marche pas.

En remerciant d'abord les braves adeptes du C++, qui prendront la peine d'éclaircir ma lanterne...  :)

Je pense que tu devrais utiliser des "const std::string&" plutot que des "std::string&", ainsi que des "const Arme&" plutot que des "Arme&", ça t'évitera des problèmes de cast.

J'avais déjà rajouté plusieurs const avant même que tu ne me répondes, en cherchant une solution... Merci quand même! :)

Apparemment, le problème venait en partie de là : ça fonctionne comme il faut, je peux - enfin - déclarer des personnages avec des paramètres.

Mais sinon, juste par curiosité, qu'est ce qu'un "problème de cast"?

Un cast, c'est quand tu veux convertir un type en un autre. Quand tu utilises des guillemets, le type est char[un_nombre], et pas std::string. Seulement, quand tu fait std::string str = "quelque chose" ; alors il y a une conversion implicite d'un type vers l'autre. On appelle cette conversion un cast, et des fois, on peut se faire avoir car ils ne sont pas toujours explicites.

À savoir que l'opérateur = pour std::string est défini sur des const char*:

http://www.cplusplus.com/reference/string/string/operator=/