Je suis entrain de m'exercer à créer un petit jeu et aimerait pouvoir demander (à l'utilisateur) comment doit s'appeler le personnage. Dans mon Personnage.h
Le problème est que je ne sais pas comment l'implémenter dans le constructeur pour permettre tout de même une modification demandée par un cin plus tard...
mais à la compilation il me met le message d'erreur : "error : expected class-name before '>>' token", ce que je traduis par "un nom de classe est attendu avant les chevrons"...
- Edité par RomainBricout 22 octobre 2018 à 11:31:44
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
Alors certes c'est possible de faire ça, mais ça ne me paraît pas pertinent, je ne pense pas que ça fasse partie des responsabilités de la classe "Personnage" de gérer la saisie, d'ailleurs ça impose la méthode d'acquisition du nom, alors qu'on pourrait vouloir le charger depuis un fichier ou le figer en littéral dans le code. Je pense que ça dois être fait en externe de la classe.
Si le nom est obligatoire (ça me parait être le cas), alors il doit apparaître dans le constructeur et ensuite une fonction membre peut permettre de le renommer éventuellement. ça donne quelque chose comme ça
Si on t'a pas encore fait le topo, le cours d'OC sur le C++ est mauvais, il est obsolète, contient des erreurs de conception et des mauvaise pratique, cet exemple/exercice en fait d'ailleurs parti. Une recherche sur le forum te donnera plus d'info
Dream on, Dream on, Dream until your dream comes true
Salut, en ce qui concerne le cours j'ai appris hier qu'il était mauvais.
En ce qui concerne le code, je ne comprends les lignes :
Personnage() = delete; // 1)
Personnage(std::string nomPersonnage);
Personnage(std::string nomPersonnage, std::string nomArme, int degatsArme); // 2)
/*
ici je ne comprends pas pourquoi faire deux constructeurs contenant le std::string nomPersonnage.
*/
peux tu m'éclairer sur ces dernières stp
- Edité par RomainBricout 22 octobre 2018 à 15:44:21
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
Le specifier delete te permet de préciser que cette fonction ne doit pas exister, car le compilateur génère par défaut les constructeurs par défaut et par copie, or dans ce cas on ne souhaite pas qu'il y ait de constructeur par défaut car on veut forcément qu'il y aie au moins en argument le nom du personnage
2)
On peut dans ce cas déclarer qu'un seul constructeur avec des valeurs par défaut sur les autres arguments si c'est à ça que tu penses, mais tu étais dans le même cas auparavant donc j'ai juste repris la même logique. ça permet d'avoir des logiques un peu différente (par exemple dans le premier constructeur je crois qu'on a un pointeur null vers une arme alors que dans le deuxième on la construit) et aussi d’interdire le constructeur avec 2 arguments
Dream on, Dream on, Dream until your dream comes true
Effectivement si on devait écrire toutes les fonctions qui n'existent pas, on serrait pas sorti de l'auberge xD
Mais là il s'agit d'un cas un peu particulier, c'est ce que j'essayais de dire. Le constructeur sans argument ( aka constructeur par défaut ), le constructeur par copie `MyClass(MyClass const & other)`, le constructeur par mouvement `MyClass(MyClass && other)`, les opérateurs d'affectations qui vont avec, et le destructeur sont automatiquement générés par le compilateur (si le contenu de la classe le permet) quand ils ne sont pas défini. Par conséquent, lorsqu'on ne les souhaite pas, il faut le préciser en spécifiant `=delete;`
Dream on, Dream on, Dream until your dream comes true
Le specifier delete te permet de préciser que cette fonction ne doit pas exister, car le compilateur génère par défaut les constructeurs par défaut et par copie, or dans ce cas on ne souhaite pas qu'il y ait de constructeur par défaut car on veut forcément qu'il y aie au moins en argument le nom du personnage
Le constructeur par défaut est automatiquement supprimé puisque tu as déclaré des constructeurs à paramètres qui ne sont pas la copie/le move.
eeeuuuuhhh, salut, j'ai fait ce que tu m'as indiqué au niveau des constructeurs et ai ensuite demandé au méchant d'attaquer le héros une fois. Ensuite j'ai afficher leur état...
Tout est cohérent sauf la vie du méchant qui se retrouve propulsée à 4 636 600.
edit : je devrais peut être empêcher la vie de dépasser 100
- Edité par RomainBricout 22 octobre 2018 à 16:54:32
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
Vu que tes constructeurs n'initialisent pas m_vie, m_vie vaut ce qu'il y a dans la mémoire à cet endroit là, c'est à dire n'importe quoi.
Tu peux initialiser par défaut:
#ifndef DEF_PERSONNAGE
#define DEF_PERSONNAGE
#include <iostream>
#include <string>
#include "Arme.h"
class Personnage
{
public:
Personnage() = delete;
Personnage(std::string nomPersonnage);
Personnage(std::string nomPersonnage, std::string nomArme, int degatsArme);
void recevoirDegats(int nbDegats);
void attaquer(Personnage &cible);
void seSoigner(int quantiteSoin);
void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
bool estVivant() const;
void afficherEtat() const;
void renommer(std::string nouveau_nom);
private:
int m_vie{100}; // Si je ne précise rien dans le constructeur m_vie vaudra 100
/*int m_vie{}; // Là m_vie vaudra la valeur d'initialisation par défaut pour un int c'est à dire 0.*/
Arme m_arme;
std::string m_nom;
};
#endif
Ou bien initialiser dans le constructeur (il est fait pour ça)
Personnage::Personnage(std::string nomPersonnage)
:m_vie{100}
,m_nom{nomPersonnage}
{
// Pareil que le ctor par défaut avant l'ajout du nom
}
Salut, je ne savais pas qu'on pouvait initialiser un attribut par défaut à l'aide des {} mais merci du tuyau. Mais du coup, si je veux le faire dans le constructeur, il faut que je le fasse dans tous les constructeurs pour que l'attribut soit tout de même initialisé si j'utilise pas le constructeur par défaut ?
Au fait, c'est quoi le ctor, ça fait plusieurs fois que je te vois le citer mais je ne sais pas ce que c'est...?
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
je ne savais pas qu'on pouvait initialiser un attribut par défaut à l'aide des {} mais merci du tuyau.
Il y a plusieurs moyens d'initialiser des valeurs (plus de détails), la syntaxe avec les accolades est à privilégier car elle unifie la manière d'initialiser entre les types, mais il faut prendre garde car sa signification dépend du contexte, ce n'est pas forcément un appel au constructeur
il faut que je le fasse dans tous les constructeurs pour que l'attribut soit tout de même initialisé si j'utilise pas le constructeur par défaut ?
Oui pour les listes d'initialisation, c'est pour ça que l'initialisation par défaut dans la définition de la classe est pratique, elle permet de ne pas te répéter pour chaque constructeur et ne spécifier que ce qui a besoin de l'être
RomainBricout a écrit:
Au fait, c'est quoi le ctor, ça fait plusieurs fois que je te vois le citer mais je ne sais pas ce que c'est...?
C'est simplement une abréviation de constructor, tu trouveras aussi dtor pour destructor
Dream on, Dream on, Dream until your dream comes true
2) donc vaut mieux toujours initialiser les attributs dans le prototype de la classe et changer seulement les trucs à changer dans le ctor
3) EHEH je suis bête... c'est tellement logique...
- Edité par RomainBricout 24 octobre 2018 à 0:56:56
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
Problème classe personnage
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg
C++ à la vie à la mort. (Le python c'est bien aussi) || Rejoignez : https://discord.gg/9r3zqgg