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 :

Un objet comme attribut.


Sujet :

C++

  1. #1
    Débutant
    Homme Profil pro
    aucun
    Inscrit en
    Avril 2012
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 152
    Points : 28
    Points
    28
    Par défaut Un objet comme attribut.
    Bonjour,

    Je sais que le titre n'est pas vraiment claire. Mais, j'ai un petit probleme. Je me demande: Est-ce qu'on peut mettre un objet comme attribut?

    Jai essayé avec ce code mais ça n'a pas marcher(ligne 21):

    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
    #include <iostream>
    #include <string>
     
    class Guerrier
    {
    private:
    	int hp;
    	int sp;
    	int xp;
    	int level;
    	int argent;
    	std::string classe;
    	std::string nom;
    	std::string technique1;
    	std::string technique2;
    	std::string technique3;
    	int force;
    	int rapidite;
    	int energie;
    	int defense;
    	Arme monArme;
    public:
    	Guerrier();
    	int getForce(int &force);
    	void recoveryHP(int &hp);
    	void recoverySP(int &sp);
    	void gagnerXp(int &xp);
    	void changerLVL(int &xp);
    	void reatsu(std::string &technique1);
    	void reveille(std::string &technique2);
    	void bankai(std::string &technique3);
    	void seFaireFrapper(int &defense);
    	bool vivant() const;
    	void dommage();
    };
     
    class Arme
    {
    private:
    	std::string nomArme;
    	int forceArme;
    	int poid;
     
    public:
    	void changerArme(std::string nouveauNom, int nouveauForce, int nouveauPoid,std::string &nomArme , int &forceArme, int &poid);
    	Arme();
    };

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    heureusement que oui..!
    "ça ne marche pas" n'est pas un message d'erreur. Sois plus précis à l'avenir.
    Tout objet doit être déclaré avant d'être utilisé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    La réponse courte d'abord:"oui, c'est possible".

    La réponse longue:

    Seulement, il faut savoir que le compilateur parcoure ton code un peu à la manière dont tu lis un livre : de la première ligne de la première page, à la dernière ligne de la dernière page.

    Tout comme toi qui ne sais pas ce qui va se passer à la page 17 quand tu n'es qu'à la page 10, le compilateur n'a connaissance que de ce qu'il a déjà rencontré.

    Quand il arrive à ta ligne 21, tu lui parle d'un type nommé "Arme", mais, comme il n'a encore rencontré ni une déclaration ni (encore moins) une définition de ce type, il te fait la seule réponse qu'il peut donner dans ce cas: désolé, je ne sais pas de quoi tu parles avec ton type "Arme".

    Et pour cause, il ne saura que "Arme" est une classe qu'à la ligne 37.

    La solution "de simplicité" consiste à, simplement, remonter la définition de "Arme" avant celle de Guerrier, mais...

    Je vois venir le coup gros comme une maison: tôt ou tard, tu voudras créer des spécialisations de Armes (faire la distinction entre les haches à une main, les flamberges, les marteaux de guerre et les haches à deux mains).

    Et comme ce seront à chaque fois des armes, tu envisageras, à juste titre, de faire hériter ces différentes armes de ta classe Arme, et tu voudras très certainement profiter du polymorphisme.

    Seulement, voilà, le polymorphisme ne peut fonctionner que sur des pointeurs (de préférence intelligents) ou sur des références, pas sur des instances "classiques".

    L'avantage, c'est que le compilateur sait parfaitement quelle taille font les pointeurs (car ce n'est jamais que adresse mémoire à laquelle on va trouver l'objet du type indiqué) et les références (car, au niveau du processeur, ca fonctionne comme un pointeur), et, surtout, que le compilateur n'a réellement besoin de connaitre le type (non seulement de savoir qu'il existe, mais aussi de quoi il est composé) que lorsqu'on essaye d'accéder à une partie de son contenu.

    Tu pourrais donc aussi envisager de:
    1. créer un fichier d'en-tête séparé pour Arme (car tu auras sans doute à connaitre Arme sans avoir forcément besoin de connaitre Guerrier )
    2. Effectuer une déclaration anticipée de Arme dans le fichier d'en-tête de Guerrier
    3. fournir un pointeur (de préférence intelligent) sur Arme à ton guerrier
    4. Si ton guerrier manipule directement l'arme dans l'une de ses fonctions, inclure le fichier d'en-tête de Arme dans le fichier d'implémentation de Guerrier
    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

  4. #4
    Débutant
    Homme Profil pro
    aucun
    Inscrit en
    Avril 2012
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 152
    Points : 28
    Points
    28
    Par défaut
    Une erreur : fichier include trop nombreux.

    Arme.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Arme.h"
     
    class Arme
    {
    private:
    	std::string nomArme;
    	int forceArme;
    	int poid;
     
    public:
    	void changerArme(std::string nouveauNom, int nouveauForce, int nouveauPoid,std::string &nomArme , int &forceArme, int &poid);
    	Arme(Guerrier &classe);
    };
    Personnage.h
    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
    #include "Arme.h"
    class Guerrier
    {
    private:
    	int hp;
    	int sp;
    	int xp;
    	int level;
    	int argent;
    	std::string classe;
    	std::string nom;
    	std::string technique1;
    	std::string technique2;
    	std::string technique3;
    	int force;
    	int rapidite;
    	int energie;
    	int defense;
    	Arme monArme;
     
    public:
    	Guerrier();
    	int getForce(int &force);
    	void recoveryHP(int &hp);
    	void recoverySP(int &sp);
    	void gagnerXp(int &xp);
    	void changerLVL(int &xp);
    	void reatsu(std::string &technique1);
    	void reveille(std::string &technique2);
    	void bankai(std::string &technique3);
    	void seFaireFrapper(int &defense);
    	bool vivant() const;
    	void dommage();
    };
    body.cpp
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #include <iostream>
    #include <string>
    #include "Personnage.h"
    using namespace std;
     
    void Guerrier::recoveryHP(int &hp)
    {
    	hp += 20;
    	cout << "Hp recovery";
    }
     
    void Guerrier::recoverySP(int &sp)
    {
    	sp += 20;
    	cout << "Sp recovery";
    }
     
    bool Guerrier::vivant() const
    {
    	if(hp > 0)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
     
    Guerrier::Guerrier()
    {
    	hp = 100;
    	sp = 100;
    	xp = 0;
    	level = 1;
    	argent = 8000;
    	force = 250;
    	rapidite = 250;
    	energie = 250;
    	defense = 250;
    	cout << "Son nom : " << endl;
    	getline(cin,nom);
    	cout << "Job : Soldat, Raider, Civile, Policier, Agent" << endl;
    	cin >> classe;
    	if(classe == "Soldat")
    	{
    	force += 125;
    	rapidite += 125;
    	energie += 125;
    	defense += 125;
    	}
    	else if(classe == "Raider")
    	{
    	force += 125;
    	rapidite += 125;
    	energie += 125;
    	}
    	else if(classe == "Policier")
    	{
    	rapidite += 125;
    	}
    	else if(classe == "Agent")
    	{
    	rapidite += 125;
    	energie += 125;
    	}
    	else
    	{
    	 classe = "Civile";
    	}
    	cout << endl << endl << "Information a propos de " << nom << "  : " << endl << "Nom : " << nom << endl << "Hp : " << hp << endl << "Sp : " << sp << endl << "Xp : " << xp << endl << "Niveau : " << level << endl << "Monnaie : " << argent << endl << endl << "Info a propos de la class " << classe << " : " << endl << "Force : " << force << endl << "Rapidite : " << rapidite << endl << "Energie : " << energie << endl << "Defense : " << defense << endl << endl;
    	system("PAUSE");
    }
     
    void Arme::changerArme(std::string nouveauNom, int nouveauForce, int nouveauPoid, std::string &nomArme, int &forceArme, int &poid)
    {
    	nomArme = nouveauNom;
    	forceArme = nouveauForce;
    	poid = nouveauPoid;
    }
     
    int main()
    {
    	Guerrier Souwn;
    }

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Voyons!!!!

    Regarde un tout petit peu la première ligne de ton fichier Arme.h, et interroges toi (à moins que ce ne soit une erreur de typo )

    Ceci dit, lorsque tu travailles avec plusieurs fichiers d'en-tête, il est toujours intéressant de veiller à placer des gardes anti inclusion
    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

  6. #6
    Débutant
    Homme Profil pro
    aucun
    Inscrit en
    Avril 2012
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 152
    Points : 28
    Points
    28
    Par défaut
    Même avec cela. Ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Personnage.h"
     
    class Arme
    {
    private:
    	std::string nomArme;
    	int forceArme;
    	int poid;
     
    public:
    	void changerArme(std::string nouveauNom, int nouveauForce, int nouveauPoid,std::string &nomArme , int &forceArme, int &poid);
    	Arme(Guerrier &classe);
    };

  7. #7
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Regarde le constructeur de Arme. Pourquoi prend-t-il un Guerrier en paramètre ?

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Allez, un petit tour vers la FAQ C++ pour savoir ce qui se passe!!!

    Et n'oublie pas tes gardes anti inclusion multiple!!!
    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

  9. #9
    Débutant
    Homme Profil pro
    aucun
    Inscrit en
    Avril 2012
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 152
    Points : 28
    Points
    28
    Par défaut
    J'ai essayé d'utiliser "/surligne{}". Mais, sa marche pas.

  10. #10
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Arme n'a pas besoin de connaître la classe Guerrier, ni la classe Personnage.

    Voici les deux lignes de codes qui posent problème (dans Arme.h)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Personnage.h"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Arme(Guerrier &classe);

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Quant à ce \surligne, je mise un paquet sur formatage de texte non pris en compte sur le site en question. Ce n'est absolument pas du C ou du C++.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Débutant
    Homme Profil pro
    aucun
    Inscrit en
    Avril 2012
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 152
    Points : 28
    Points
    28
    Par défaut
    Merci pour votre aide, super les cours C++ et la FAQ C++

Discussions similaires

  1. Passer un objet comme attribut d'une classe
    Par Leduc08 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/04/2011, 11h54
  2. Réponses: 1
    Dernier message: 12/04/2010, 16h49
  3. Une Liste d'objets comme attribut d'objet
    Par koomkoom dans le forum Langage
    Réponses: 1
    Dernier message: 31/08/2008, 19h20
  4. fonction comme attribut
    Par TERRIBLE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/01/2006, 00h13
  5. [POO] Objet en attribut d'un objet
    Par Tchinkatchuk dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 10h00

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