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 :

Surcharge constructeur !


Sujet :

C++

  1. #1
    Membre averti Avatar de speedy_souris
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut Surcharge constructeur !
    Bonjour à toutes et tous,

    j'ai simplement une petite question, comment peut-on surcharger un constructeur de cette façon

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personnage::Personnage(string epee, int degatsEpee) : m_Vie(....), m_arme(epee, degatsEpee){}
     
    Personnage::Personnage(string bouclier, int protectionBouclier) : m_vie(....), m_arme(bouclier, protectionBouclier){}

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    Simple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Personnage(string value_str, int value, bool is_damage) : m_Vie(....), m_arme(value_str, value, is_damage){}
    Édit: Simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Personnage(string value_str, int value, bool is_damage) : (is_damage? m_Vie(....): m_vie(....)), m_arme(value_str, value){}

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu as conscience que tes deux surcharges sont strictement identiques ?

    Si tu as besoin de différencier bouclier / épée, peut-être qu’il serait intéressant de les typer plus fortement que simplement avec un std::string.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 750
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Tu as conscience que tes deux surcharges sont strictement identiques ?
    Il y a une majuscule m_Vie au lieu de m_vie

    Après faute de frappe ou pas

  5. #5
    Membre averti Avatar de speedy_souris
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut Faute de frappe !!!
    Citation Envoyé par foetus Voir le message
    Il y a une majuscule m_Vie au lieu de m_vie

    Après faute de frappe ou pas
    c'est bien une faute de frappe...

    speedy_souris a encore frapper

    aussi peut etre creuser la piste sur le fait que le bouclier n'est pas une arme mais une protection (a voir autre classe )

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Franchement, pour ce genre de jeu, je verrais plutôt une gestion de l'équippement de ce genre:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    enum PlaceEquipement //Note: utiliser "enum class" si supporté
    {
    	Tete,
    	Torse,
    	MainGauche,
    	MainDroite,
    	MAXp1_PLACE_EQUIPEMENT
    };
     
    struct ObjetEquipable
    {
    	//Ici, on supporte TOUTES les propriétés des objets,
    	//comme ça certains peuvent servir aux deux (bouclier à pointe, épée avec garde, etc.)
    	string nom;
    	int protection;
    	int degats;
    };
     
    class Personnage
    {
    private:
    	vector<ObjetEquipable*> equipement;
    	bool estGaucher;
    public:
    	Personnage(bool estGaucher) : equipement(MAXp1_PLACE_EQUIPEMENT), estGaucher(estGaucher) {  }
     
    	void equipe(PlaceEquipement place, ObjetEquipable* objet) { equipement.at((int)place) = objet; }
     
    	ObjetEquipable const * getArme() const
    	{
    		return estGaucher ? equipement.at((int)MainGauche) : equipement.at((int)MainDroite);
    	}
    	//Ensuite, pour la protection, un truc de ce genre, ou de l'autre:
    	int getSommeProtections() const
    	{
    		//Note: En fait, il doit y avoir un truc dans <algorithm> qui fait ça pour toi
    		int total = 0;
    		for(vector<ObjetEquipable*>::const_iterator it = equipement.begin() ; it != equipement.end() ; ++it)		
    		{
    			if((*it) != null)
    				total += (*it)->protection;
    		}
    		return total;
    	}
    	ObjetEquipable const * getMeilleureProtection() const
    	{
    		//Note: En fait, il doit y avoir un truc dans <algorithm> qui fait ça pour toi
    		ObjetEquipable const* meilleur = null;
    		for(vector<ObjetEquipable*>::const_iterator it = equipement.begin() ; it != equipement.end() ; ++it)		
    		{
    			if((*it) != null)
    			{
    				if(meilleur==null || (*it)->protection > meilleur->protection) 
    					meilleur = *it;
    			}
    		}
    		return meilleur;
    	}
    };
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : aucun

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

    Pour la surcharge de fonctions, il y a deux règles simples à respecter:
    1. le nom du paramètre n'a aucun intérêt pour le compilateur (il se foutra pas mal de savoir si le premier paramètre s'appelle bouclier ou épée )
    2. pour chaque surcharge, il faut au moins une différence par rapport au autres; soit au niveau du nombre de paramètres, soit au niveau du type d'au moins un des paramètres attendus.

    Ton exemple ne respecte pas la règle (2) et les noms tombent sous le coup de la règle (1). ==> Raté... Try again
    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

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Février 2013
    Messages : 70
    Par défaut
    Je ne suis pas étranger au domaine du jeu de rôle ayant écrit et dirigé le scénario de tournoi utilisé lors du tournoi d'Appel de Chtulhu de réanimation 95 à Montréal.

    Votre constructeur comporte une erreur de conception flagrante. Un personnage et son équipement sont deux entités distinctes qui évoluent de manière distinctes dans les temps. Si un personnage lieutenant de police tombe à zéro point de santé mentale, son arme et sa carte de police devront lui être retirées durant son traitement. Si le lieutenant meurt en service, tout son équipement tombera au sol et pourra être récupéré par les autre PJ ou par un PNJ. Le personnage peut mourir et l'équipement survivre. Un personnage peut vivre mais son équipement peut être perdu, devenir défectueux, être endommagé. L'équipement peut changer de propriétaire.

    Un type énuméré limiterait l'équipement de manière inacceptable. Même après la réalisation d'un moteur de jeu de rôle, on doit être en mesure d'ajouter une pièce d'équipement sans toucher au moteur d'où l'importance d'utiliser une hiérarchie de classes pour l'équipement et des patrons de conception appropriés pour la création. En fait, l'équipement se prête de façon idéale à l'orientation objet, les règlements du jeu de rôle classent déjà l'équipement en catégorie: par exemple armes à feu qui contient armes de poing, armes longues et armes de guerre, armes blanches qui renferme dagues, épées, armes d'hast...

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par Pierre le Grand Voir le message
    En fait, l'équipement se prête de façon idéale à l'orientation objet, les règlements du jeu de rôle classent déjà l'équipement en catégorie: par exemple armes à feu qui contient armes de poing, armes longues et armes de guerre, armes blanches qui renferme dagues, épées, armes d'hast...
    Attention, cela se prête en fait mal à une hiérarchie de classes. Par contre, un système de "tags" ou de classes de traits pourrait être approprié...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/07/2011, 14h34
  2. surcharge constructeur Form
    Par Pfeffer dans le forum C++Builder
    Réponses: 14
    Dernier message: 19/07/2011, 11h53
  3. Surcharge constructeur this et base ?!?
    Par topolino dans le forum C#
    Réponses: 2
    Dernier message: 24/02/2009, 15h15
  4. Surcharge constructeur : Arguments variables et ArrayList
    Par vb2013 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/06/2008, 09h39
  5. [1.1][VB.NET] surcharge constructeur conversion restrictive
    Par lucie.houel dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/12/2006, 15h07

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