Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C++]Compilation et POO

Sujet résolu
    9 mai 2006 à 13:08:30

    Bonjour à tous,

    J'ai un petit souci lorsque j'essaye de compiler mon programme. Le compilateur bloque sur une ligne ne comportant qu'un '{', et me donne une erreur relative à une classe absente de ce fichier o_O

    Je pense que vous comprendrez mieux en vous montrant le code:
    #ifndef ResultatModele_cpp
    #define ResultatModele_cpp

    #include "SerieTemporelle.cpp"
    #include "ResultatModele.h"

    #include <string>
    using namespace std;

    ResultatModele::ResultatModele (string *nom_r, bool const *crois)
    { // Ligne 11
        this->initCroissance(crois);
        nom = *nom_r;
    }

    ResultatModele::ResultatModele (string *nom_r, bool const *crois , SerieTemporelle const *s)
    {
        this->initCroissance(crois);
        this->initExtrapol(s);
        nom = *nom_r;
    }

    // ...


    Et voici l'erreur sortie par le compilateur:
    ...
    C:\.../ResultatModele.cpp: In constructor `ResultatModele::ResultatModele(std::string*, const bool*)':
    C:\.../ResultatModele.cpp:11: error: no matching function for call to `SerieTemporelle::SerieTemporelle()'
    C:\.../SerieTemporelle.cpp:124: note: candidates are: SerieTemporelle::SerieTemporelle(const SerieTemporelle&amp;)
    C:\.../SerieTemporelle.cpp:23: note: SerieTemporelle::SerieTemporelle(const TNT::Array1D<float>*, const std::string*)
    C:\.../SerieTemporelle.cpp:17: note: SerieTemporelle::SerieTemporelle(const std::string*, const std::string*)
    ...
    Je vous ai indiqué la ligne 11 dans le code du dessus pour que vous voyez ce qui fait planter le truc.

    J'espère que vous pourrez me guider dans la résolution de ce problème!!

    Merci d'avance, Martin.
    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2006 à 13:28:13

      Citation : K-jasi


      #ifndef ResultatModele_cpp
      #define ResultatModele_cpp

      #include "SerieTemporelle.cpp"
      #include "ResultatModele.h"
      <...>



      Bien qu'éternel débutant en C++, je dirais que sans voir la définition de la classe, on n eprut rien dire. D'autre part ces inclusions de .cpp sont suspectes. Ce que l'on inclu, ce sont les .h, pas les .cpp.

      Enfin, et pour les mêmes raisons, les protections contre les inclusions multiples n'ont rien à faire dans un .cpp.

      Je te conseille de commencer par mettre ton organisation de code 'au carré'.
      • Les classes dans les .h
      • Les méthodes dans les .cpp

      Ca sera déjà beaucoup plus clair.
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        9 mai 2006 à 13:30:35

        Si je ne met que les classes dans les .h, et que je n'inclus que des .h, comment va-t-il connaitre la définition des méthodes?
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2006 à 13:37:02

          Tu fais de la compilation séparé!

          Je t'explique ;)
          Tu fais ton .h contenant tous les prototypes.
          Ensuite, tu fais tes .cpp contenant tout ce qu'il faut;

          Enfin, tu compile tes .cpp en assembleur avec cette commande :

          g++ -c SerieTemporelle.cpp


          Et pour finir, tu compile ton programme avec tous les .o et les linkers.

          Pour bien comprendre, voici une super Makefile qui te fera le travail en tapant la commande make

          all: projet

          projet: SerieTemporelle.o ResultatModele.o main.o
          g++ -o projet SerieTemporelle.o ResultatModele.o main.o #+LINKER

          SerieTemporelle.o: SerieTemporelle.cpp
          g++ -c SerieTemporelle.cpp

          ResultatModele.o: ResultatModele.cpp
          g++ -c ResultatModele.cpp

          main.o: main.cpp
          g++ -c main.cpp

          clean:
          rm -fr *.o

          mrproper:
          rm -fr projet


          Sous windows, ton ide gere tout seul la compilation des projets !
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2006 à 14:14:18

            J'ai suivi vos conseils, et j'ai appliqué la fameuse 'Compilation séparée'. Je n'inclus plus de .cpp, et je laisse faire le makefile par l'ide. J'obtiens exactement la même erreur o_O

            Je vais vous donner l'entete de tous mes fichiers, parce que là je ne vois vmt pas ce qui foire...
            Main.cpp:
            #include <cstdlib>
            #include <iostream>
            #include <string>
            using namespace std;

            #include "SerieTemporelle.h"
            #include "ResultatModele.h"

            int main(int argc, char *argv[])
            {
                //...
            }


            SerieTemporelle.h:
            #ifndef SerieTemporelle_h
            #define SerieTemporelle_h

            #include <string>
            using namespace std;

            #include "tnt/tnt.h"
            using namespace TNT;

            /**
            *       Représente une série temporelle, et permet de nombreuses opérations sur ce type de données.
            */

            class SerieTemporelle
            {
                // Tous mes prototypes
            }


            SerieTemporelle.cpp:
            #include "SerieTemporelle.h"

            #include <iostream>
            #include <fstream>

            SerieTemporelle::SerieTemporelle (string const *n)
            {
                initNom(n);
            }

            // Définition des autres méthodes...


            ResultatModele.h:
            #ifndef ResultatModele_h
            #define ResultatModele_h

            #include "SerieTemporelle.h" // Je le met car sinon j'ai une erreur comme quoi SerieTemporelle n'a pas été définie

            #include <string>
            using namespace std;

            // Prototype de la classe


            ResultatModele.cpp:
            #include "ResultatModele.h"

            ResultatModele::ResultatModele (string *nom_r, bool const *crois)
            { // L'erreur de compilation se fait à cette ligne, toujours 'no matching function'
                this->initCroissance(crois);
                nom = *nom_r;
            }

            // Définition des méthodes


            Je pense avoir suivi ce que vous disiez, où ais-je pu me tromper?

            Merci d'avance...
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2006 à 14:18:39

              Montre nous le prototype de ta classe ResultatModele.
              • Partager sur Facebook
              • Partager sur Twitter
                9 mai 2006 à 14:21:25

                Voici le fichier ResultatModele.h complet:
                #ifndef ResultatModele_h
                #define ResultatModele_h

                #include "SerieTemporelle.h"

                #include <string>
                using namespace std;

                /**
                *       Représente les résultats de l'application d'un modèle sur une série temporelle.
                */

                class ResultatModele
                {
                        public:
                                /**
                                * Définit si la croissance de la série sera positive ou non.
                                *
                                * @param crois Croissance (true si croissance positive)
                                */

                                ResultatModele (string *nom_r, bool const *crois);
                       
                        /**
                                * Définit si la croissance de la série sera positive ou non.
                                * Donne une extrapolation de la série, si le modèle a pu en fournir.
                                *
                                * @param crois Croissance (true si croissance positive)
                                * @param s Extrapolation de la série, sous forme de série temporelle.
                                */

                                ResultatModele (string *nom_r, bool const *crois , SerieTemporelle const *s);
                               
                                /**
                                * Initialise la croissance de la série.
                                *
                                * @param crois Croissance (true si croissance positive)
                                */

                                void initCroissance (bool const *crois);
                               
                                /**
                                * Renvoie la croissance de la série.
                                *
                                * @return Croissance (true si croissance positive)
                                */

                                bool const lireCroissance () const;
                               
                                /**
                                * Initialise l'extrapolation (si il y a) de la série.
                                *
                                * @param s La série extrapolée
                                */

                                void initExtrapol (SerieTemporelle const *s);
                               
                                /**
                                * Renvoie l'extrapolation de la série
                                *
                                * @return Extrapolation de la série
                                */

                                SerieTemporelle const lireExtrapol () const;
                       
                        private:
                                SerieTemporelle serie;
                                bool resultatPositif;
                                string nom;
                };

                #endif
                J'ai oublié de signaler que mon IDE est Dev-C++.
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2006 à 15:15:18

                  Citation : K-jasi


                  SerieTemporelle.h:

                  #ifndef SerieTemporelle_h
                  #define SerieTemporelle_h

                  #include <string>
                  using namespace std;

                  #include "tnt/tnt.h"
                  using namespace TNT;

                  /**
                  *       Représente une série temporelle, et permet de nombreuses opérations sur ce type de données.
                  */

                  class SerieTemporelle
                  {
                      // Tous mes prototypes
                  }



                  • Je ne connais pas "tnt/tnt.h"
                  • Il manque un ';' à la fin de la définition de la classe...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    9 mai 2006 à 15:20:26

                    Le ; est bien dans le fichier source, c'est juste en recopiant que je l'ai pas mis (pas mis le #endif aussi...).

                    Pour TNT, voir ici...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 mai 2006 à 15:21:42

                      J'ai trouvé !

                              private:
                                      SerieTemporelle serie;
                                      bool resultatPositif;
                                      string nom;

                      Tu déclares ici un membre de type SerieTemporelle, qui n'a pas de constructeur sans paramètre, je me trompe ? Tu dois donc créer un contructeur adéquat (c'est à dire SerieTemporelle::SerieTemplorelle(void)), ou préciser les paramètres du constructeur dans le constructeur de ResultatModele :
                      #include "ResultatModele.h"

                      ResultatModele::ResultatModele (string *nom_r, bool const *crois)
                       : serie(/* paramètres */)  // Ligne à rajouter
                      { // L'erreur de compilation se fait à cette ligne, toujours 'no matching function'
                          this->initCroissance(crois);
                          nom = *nom_r;
                      }

                      Le compilateur attendant les paramètres, c'est pour cela que l'erreur est signalée à cette ligne.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 mai 2006 à 15:39:13

                        J'ai pas compris remram44, je ne crois pas que la classe ResultatModele soit un héritage de la classe SerieComplete
                        Il est vrai qu'il faut initialiser serie, mais je pense qu'il y a un conflit de méthode entre les classes !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 mai 2006 à 15:43:14

                          J'ai essayé ceci (comme ca j'utilise un constructeur existant):
                          #include "ResultatModele.h"

                          ResultatModele::ResultatModele (string *nom_r, bool const *crois)
                          {
                              string const nom_s = (*nom_r)+"_AR_ext";
                              serie = new SerieTemporelle(&nom_s);
                              this->initCroissance(crois);
                              nom = *nom_r;
                          }
                          Toujours la même erreur.

                          Je ne vois pas ce que tu veux que je mette à la place de /* paramètres */ dans l'exemple que tu m'as donné.

                          Edit: Effectivement Natim, il n'y a pas d'héritage entre ces deux classes.
                          Edit2: J'ai contourné la difficulté en définissant un constructeur SerieTemporelle(void). Merci pour tout !
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 mai 2006 à 16:36:37

                            Citation : Natim

                            J'ai pas compris remram44, je ne crois pas que la classe ResultatModele soit un héritage de la classe SerieComplete


                            Rien à voir avec l'héritage. Si tu as des membres de ta classe qui ont des constructeurs utilisant des paramètres, tu dois appeller ces constructeurs avant le code du constructeur de la classe, par exemple :

                            // Classe simple, avec un constructeur prenant un int
                            class Truc {
                            public:
                                Truc(int);
                            };

                            // Classe ayant un membre de type Truc
                            class Machin {
                            private:
                                Truc un_truc; // Ici, le constructeur ne sera pas appelé,
                                              // car il n'y a pas de constructeur sans paramètre
                                              // dans la classe Truc
                            public:
                                Machin();
                            };

                            Machin::Machin()
                             : un_truc(12) // Ici, on appelle le constructeur avec un int, et c'est bon !
                            {
                            }

                            Truc::Truc(int param)
                            {
                            }

                            C'est plus clair ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 mai 2006 à 17:26:43

                              Le souci, c'est qu'on ne sais pas nécéssairement quoi mettre là où tu mets le 12, on n'a pas vraiment de libertés sur la définition de ce paramètre...
                              • Partager sur Facebook
                              • Partager sur Twitter

                              [C++]Compilation et POO

                              × 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