Partage
  • Partager sur Facebook
  • Partager sur Twitter

declaration dobjet, pour en declarer un il fau declare l'autre

..Et pour declarer l'autre il faut l'un.

Sujet résolu
    9 juin 2007 à 18:18:01

    Bonjour :) ,
    Je continue le petit rpg de m@theo pour bien gérer les objets.
    Au bout d'un moment je me suis rendu compte qu'il était mieux de separer les ennemi du personnage j'ai donc créer un nouvel objet "Ennemi".
    Le problème c'est que dans la declaration (le fichier.h) une des methodes utilise l'objet Personnage. Il faudrait donc que je declare Personnage avant Ennemi mais dans Personnage.h je me sert de l'objet ennemi du coup je ne sais pas comment faire..
    Si quelqu'un a une solution, ce ne serait pas de refus :p !
    Vous dites si vous avez besoin que je post des codes ou non il me semble que ce n'est pas utile m'enfin...

    Ps: voici l'ordre des include :
    main.cpp inclut Personnnage.h
    Personnage.h inclut Inventaire.h et Ennemi.h
    Inventaire.h inclut Arme.h

    Voili voilou ;)
    • Partager sur Facebook
    • Partager sur Twitter
      9 juin 2007 à 18:27:36

      il faut faire de la façon suivante :
      // Personnage.h
      class Enemi;

      class Personnage
      {
         // ...
      };

      et
      // Enemi.h
      class Personnage; // je sais plus s'il est obligatoire

      classe Enemi
      {
         //...
      }
      • Partager sur Facebook
      • Partager sur Twitter
        9 juin 2007 à 18:30:59

        J'essaye ça tout de suite !
        Il y a encore une erreur :euh:
        donc dans main j'inclut Ennemi.h qui lui même inclut Personnage.h.
        J'ai donc rajouter au debut de Personnage.h
        class Ennemi;

        Mais dans Personnage.cpp, il me met une erreur a chaque ligne où j'utilise Ennemi :
        error: invalid use of definition type 'struct Ennemi'
        error: forward declaration of 'struct Ennemi'

        Ladeuxieme erreur est tout le temps a la ligne 6, c'est cellee où j'ai écrit
        class Ennemi;
        En faite j'utilise une méthode de Ennemi mais vu qu'il n'est pas déclarer complétement ba je pense qu'il ne connait pas ces méthode, enfin je croi que c'est ca mais je ne sais pas comment y remédier...
        • Partager sur Facebook
        • Partager sur Twitter
          9 juin 2007 à 18:54:13

          c'est des struct que tu utilises ?
          • Partager sur Facebook
          • Partager sur Twitter
            9 juin 2007 à 19:02:23

            t'as essayé sans le classe Personnage; ou l'autre ?

            sinon montre ton code.
            • Partager sur Facebook
            • Partager sur Twitter
              9 juin 2007 à 19:09:33

              Voila le code j'en enleve des bouts qui ne servent a rien parce que se serait vraiment trop long
              Main.cpp
              #include <iostream>
              #include <string>
              #include "Ennemi.h"
              #include "main.h"

              using namespace std;


              int main()
              {
              [...]

              Ennemi.h
              #ifndef DEF_ENNEMI
              #define DEF_ENNEMI
              #include "personnage.h"
              // Ne PAS oublier d'inclure Arme.h pour en avoir la définition

              class Ennemi
              {
                  public:
                  //constructeurs
                  Ennemi();
                  Ennemi(std::string nom, std::string nomArme, int degatsArme, int exp, int niveau);

                  ~Ennemi();

                  //tous les gets
                  int getExp() const;
                  int getArmure() const;
                  int getNiveau() const;
                  std::string getNom() const;

                  //Méthodes de combat
                  void recevoirDegats(int nbDegats);
                  void attaquer(Personnage &cible);
                  void boirePotionDeVie(int quantitePotion);
                  bool estVivant();
                  bool estCritique();

                  //Méthodes post-combat
                  void regen();
                  Inventaire m_Inventaire;// Notre arme est "contenue" dans le Ennemi
                  void afficherEtat();


                  private:

                  std::string m_nom;
                  int m_vie;
                  int m_exp;
                  int m_niveau;
                  int m_mana;
                  Arme m_arme;
                  Arme m_armeLégendaire;
                  Arme m_armeRare;
                  Arme m_armePeuCommune;
                  Arme m_armeBanale;
                  int MaxPotion;
                  int m_force;
                  int m_armure;
                  int m_intelligence;
                  int m_robustesse;
                  int m_affinitesMagiques;
              };

              #endif

              Personnage.h
              #ifndef DEF_PERSONNAGE
              #define DEF_PERSONNAGE


              #include "Inventaire.h"
              class Ennemi;
              class Personnage
              {
                  public:
                  //constructeurs
                  Personnage();
              [...]


              Personnage.cpp
              #include <iostream>
              #include <string>
              #include "Personnage.h"

              using namespace std;


              [...]



              void Personnage::attaquer(Ennemi &cible)
              {
                  int dgts=0;
                  dgts=m_force+m_arme.getDegats();
                  dgts-=(cible.getArmure()/1000);//Une des nombreuse lignes qui plantent
                  cible.recevoirDegats(dgts);//elle aussi plante
                  cout << m_nom << " attaque " << cible.getNom() << " et lui fait perdre " << dgts << " points de vie !" << endl  <<endl;//et elle aussi
              }
              • Partager sur Facebook
              • Partager sur Twitter
                9 juin 2007 à 19:18:54

                j'ai réussi a compiler avec ça :
                // Ennemi.h
                #ifndef DEF_ENNEMI
                #define DEF_ENNEMI

                #include "personnage.h"

                class Personnage;
                class Ennemi
                {
                    public:

                    Ennemi();

                };

                #endif

                // Personnage.h
                #ifndef DEF_PERSONNAGE
                #define DEF_PERSONNAGE


                #include "Ennemi.h"

                class Ennemi;
                class Personnage
                {
                    public:
                    //constructeurs
                    Personnage();
                };
                #endif
                • Partager sur Facebook
                • Partager sur Twitter
                  9 juin 2007 à 19:21:41

                  Il est peu-être préférable de mettre qu'une classe par fichier :) .
                  Mais logiquement ça doit marcher d'en mettre plusieurs..
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 juin 2007 à 19:22:52

                    Merci ca marche je comprend pas vraiment pourquoi mais le principal c'est que ca marche, merci bc de ton aide ;)
                    EDIT: Il n'y a qu'une classe par fichier le problème c'est qu'il fallait inclure l'une dans l'autre et l'autre dans l'une hors je n'avai pas inclut l'autre dans l'une car je ne voyait pas l'intérêt mais ca marche :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juin 2007 à 0:05:25

                      Problème de référence croisée -> http://c.developpez.com/faq/cpp/?page=classes#CLASS_reference_croisee

                      Mais tout ce qui distingue un ennemi d'un personnage, c'est l'endroit où sont prisent les décisions (joueur ou IA). Tu devras attendre le chapitre sur le polymorphisme (d'inclusion) pour une solution simple et efficace.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                        10 juin 2007 à 1:28:44

                        Bonjour,

                        Citation : binariman

                        Bonjour :) ,
                        Je continue le petit rpg de m@theo pour bien gérer les objets.


                        Je fait de meme.

                        Citation : binariman

                        Au bout d'un moment je me suis rendu compte qu'il était mieux de separer les ennemi du personnage j'ai donc créer un nouvel objet "Ennemi"


                        Pourquoi, tu fait une petite IA? si oui ca m'interesse, on pourait en parler, en PV si tu veut, sinon, je voi pas l'interet puisque l'ennemi est un Personnage lui aussi.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juin 2007 à 12:29:17

                          Citation : Golderack

                          sinon, je voi pas l'interet puisque l'ennemi est un Personnage lui aussi.


                          Qui te dit qu'il y a forcément les mêmes attributs et méthodes ;) .

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2007 à 21:46:29

                            Et faire hériter ta class ennemi de ta class personnage, ça pourrait pas te simplifier la vie (en même temps, l'héritage, mateo en a pas parlé non plus)...

                            Etant donné que l'ennemi a également une méthode recevoirDegat, ça te ferai moins de code à écrire.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 juin 2007 à 23:55:19

                              Bonjour, excusez moi je n'avais pas vu vaut réponse, dans ma tête le sujet était clos :D donc en effet m@theo n'a pas encore parler d'heritage donc je ne m'en sert pas.En ce qui concerne la séparation de Personnage et Ennemi c'est du au fait, comme la dit garulfoUnix c'est parce qu'il n'y a pas les mêmes méthodes et attributs ex : l'ennemi n'a pas d'inventaire, il n'a pas de méthode permettant la sauvegarde etc... Pour l'instant j'essaye de rendre tout ca visuellement avc SDL.Je n'ai pas fait d'intelligence artificielle ( mise à part qu'il prend une potion quand il est failble) mais on peut normalment en rajouter une facilement (merci la POO ^^ ).
                              Golderack si tu veux plus d'infos PM moi ;)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              declaration dobjet, pour en declarer un il fau declare l'autre

                              × 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.
                              • Editeur
                              • Markdown