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 :

Utilisation des méthodes de classe dans une autre classe


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Points : 73
    Points
    73
    Par défaut Utilisation des méthodes de classe dans une autre classe
    Bonjour,

    J'ai une classe "awale", qui possède des méthodes, dont "prendre_graines()". Cette méthode est utilisée dans une autre méthode d'une autre classe "joueur"... Mon soucis est que je n'arrive pas à mettre cela en place :S

    Voici mon code :

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #include <iostream>
     
    using namespace std;
     
    class awale
    {
    	private:
    		int	i;
    		int	jeu[12];
     
    	public:
    		awale()
    		{
    			for(i=0;i<12;i++)
    			{
    				jeu[i]=4;
    			}
    		}
     
    		void	afficher()
    		{
    			for (i=0;i<6;i++)
    			{
    				cout << jeu[i] << ' ';
    			}
    			cout << endl;
    			for (i=6;i<12;i++)
    			{
    				cout << jeu[i] << ' ';
    			}
    			cout << endl;
    		}
     
    		int	nb_graines(int n)
    		{
    			return jeu[n];
    		}
     
    		float	prendre_graines(int n)
    		{
    			jeu[n]=0;
    		}
     
    		float	ajouter_graine(int n)
    		{
    			jeu[n]++;
    		}
    };
     
    class joueur
    {
     
    	private:
    		awale	mon_awale;
    		int	score;
     
    	public:
    		joueur()
    		{
    			score=0;
    		}
     
    		bool	jouer(int n)
    		{
    			if (nb_graines(n)!=0)
    			{
    				int m=n;
    				int nb=nb_graines(n);
    				prendre_graines(n);
    				for (int i=1;i<=nb;i++)
    				{
    					m++;
    					if (m==12)
    					{
    						m=0;
    					}
    					ajouter_graine(m);
    				}
    				while ((nb_graines(m)==2 || nb_graines(m)==3) && m>=0 && m<6)
    				{
    					score+=nb_graines(m);
    					prendre_graines(m);
    					m--;
    				}
    			}
    			else
    			{
    				return false;
    			}
     
    		}
    };
     
    int main()
    {
    	awale jeu;
    	joueur joueur1;
     
    	int n;
     
    	jeu.afficher();
    	do
    	{
    		cin >> n;
    		n+=5;
    		joueur1.jouer(n);
    	}
    	while (n>0 && n<=6);
    	return 0;
    }
    Forcément, l'appel des méthodes "nb_graines()", "prendre_graines()", et "ajouter_graine()" déclenche une erreur de compilation.

    Quelqu'un pourrait me donner un coup de main? Merci d'avance!

    PS : je sais qu'il faut que je sépare mes classes dans des fichiers .h et .cpp, mais je voudrais régler ce soucis là avant....

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ces fonctions sont membres de la classe awale, il faut donc les appeler avec une instance d'awale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mon_awale.nb_graines()
    mon_awale.prendre_graines()
    mon_awale.ajouter_graine()

  3. #3
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Points : 73
    Points
    73
    Par défaut
    Merci de ta réponse. Mon soucis venait du fait que je voulais réutiliser l'objet awale créé dans mon main (soit avec un pointeur, soit avec autre chose). Mais je n'y arrive pas :S

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

    Informations professionnelles :
    Activité : aucun

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

    De manière générale, si tu veux qu'une variable externe à une classe soit utilisée dans une fonction, il faut lui fournir cette variable comme argument...

    Mais, l'avantage, c'est que tu peux tres bien surcharger les fonctions membres de tes différentes classes:

    Ainsi, tu pourrais tres bien envisager ta classe Joueur sous la forme de
    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
     
    class joueur
    {
        private:
            awale mon_awale;
            int score;
        public:
            /* Le constructeur que tu as dejà */
            joueur(){/*...*/}
            /* Idéalement, il serait pas mal de fournir un constructeur prenant un
             * awale en parametre (histoire de pouvoir directement initialiser 
             * mon_awale */
           joueur(const awale& aw):mon_awale(aw),score(0){}
           /* le destructeur, que tu as oublié */
           ~joueur(){/*...*/}
          /* la fonction Jouer telle que tu l'a écrite */
          bool jouer(int i)
          {
              /*...*/
          }
          /* une fonction jouer avec un awale qui n'a rien à voir avec celui qui
           * est membre de la classe */
          bool jouer(awale& aw,int i)
          {
              /* utiliser aw (dans l'exemple) au lieu de mon_awale chaque fois que 
               * tu as besoin d'un awale ;) */
          }
          /*...*/  
    };
    L'énorme avantage, c'est que le compilateur sera en mesure de choisir tout seul, en fonction des arguments passés à Jouer, s'il doit utiliser la fonction membre qui utilise le membre mon_awale ou non

    J'en profite pour attirer ton attention sur le fait qu'il serait pas mal de prévoir un constructeur utilisant une référence constante sur un awale afin de permettre l'initialisation de mon_awale...

    D'ailleurs, dans le cas où tu envisagerais de permettre de reprendre une partie sauvegardée, il serait carrément pas mal de prévoir le constructeur sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Jeu(const awale& aw, int score=0):mon_awale(aw),score(score){}
    Le fait que le dernier parametre prenne un argument par défaut (le "=0") permet, selon les besoin d'utiliser la valeur par défaut (dans le cadre d'une nouvelle partie, selon l'exemple) ou d'utiliser la valeur fournie en parametre (dans le cadre d'une partie continuée)

    [EDIT]lors de l'écriture du post, je ne savais pas si aw avait intéret à etre constant ou non... au vu du code de jouer, il semble que aw sera modifié dans la fonction jouer, et que aw ne doive par conséquent ne pas etre constant

  5. #5
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Points : 73
    Points
    73
    Par défaut
    Merci de ton aide. Je vois mieux comment faire, et en plus j'ai appris une nouvelle notation pour affecter les paramètres à une variable locale .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  2. Réponses: 12
    Dernier message: 29/10/2008, 08h40
  3. Réponses: 3
    Dernier message: 29/04/2008, 14h14
  4. utiliser les attribut d'une classe dans une autre classe
    Par kaissaoui dans le forum Langage
    Réponses: 11
    Dernier message: 18/07/2007, 15h13
  5. Réponses: 3
    Dernier message: 25/12/2006, 20h45

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