Partage
  • Partager sur Facebook
  • Partager sur Twitter

vector d'objets dans un prototype de classe

vectors, pointeurs et POO

Sujet résolu
    24 juillet 2020 à 21:08:19

    Bonjour à tous,

    Pour un projet, j'aimerais créer un certain nombre d'objets depuis la même classe, en me renseignant un peu, j'ai vu que la manière propre de le faire, c'était de créer des vectors contenant des pointeurs, et ensuite via une méthode de cette classe principale créer via des boucles les objets en question. J'avais trouvé des codes de ce type sur le net...

    #define MAX_OBJ   10
     
    vector<Obj*> v;
     
    v.reserve(MAX_OBJ);
     
    for(int i=0; i<MAX_OBJ;i++)
    {
           push_back(new Obj());
    }

    Seulement, lorsque je crée mes attributs de classe, avec des vector<Obj*>, ce sont les premiers trucs qui le font crier... Si quelqu'un pouvait m'expliquer pourquoi ça serait top !! (J'ai essayé de mettre chaque classe dans un *.h et un *.cpp différent, j'ai exactement les mêmes messages d'erreurs).

    La classe avec les vectors est la première.

    Mon *.h

    #ifndef MY_FILE_INCLUDED
    #define MY_FILE_INCLUDED
    
    #include <iostream>
    #include <fstream>
    #include <sstream>                                                                    
    #include <vector>
    #include <string>
    
    #include "error.h"
    
    #include <eigen3/Eigen/Dense>
    
        #ifndef DEF_MAIN_ARRAY
        #define DEF_MAIN_ARRAY
    
        class Main_Array
        {
          public:
            Main_Array(Eigen::ArrayXXi array);
            Main_Array(std::string imput_file);
            ~Main_Array();
            int get(short x, short y);
            void disp();
            void set();
            
    
          private:
            Eigen::ArrayXXi m_table;
            std::vector<Sub_Array*> m_Sub_Arrays_list;
            std::vector<Col*> m_Cols_list;
            std::vector<Line*> m_Lines_list;
            std::vector<Cell*> m_Cells_list;
    
            void set_Sub_Arrays();
            void set_Cols();
            void set_Lines();
            void set_Cells();
        };
    
        #endif 
    
        #ifndef DEF_SUB_ARRAY
        #define DEF_SUB_ARRAY
    
        class Sub_Array
        {
          public:
            Sub_Array(Main_Array *main = 0, short x = 0, short y = 0);
            ~Sub_Array();
            void disp();
    
          private:
            Main_Array *m_main;
            short m_x;
            short m_y;
            /*
            short m_mapping;
            std::vector<Cell*> m_Cells;
            Eigen::VectorXi m_values;
            */
        };
    
        #endif
    
        #ifndef DEF_COL
        #define DEF_COL
    
        class Col 
        {
          public:
            Col(Main_Array *main = 0, short x = 0);
            ~Col();
            void disp();
          
          private:
            Main_Array *m_main;
            short m_x;
        };
    
        #endif
    
        #ifndef DEF_LINE
        #define DEF_LINE
    
        class Line 
        {
          public:
            Line(Main_Array *main = 0, short = 0);
            ~Line();
            void disp();
    
          private:
            Main_Array *m_main;
            short m_y;
        };
    
        #endif
    
        #ifndef DEF_CELL
        #define DEF_CELL
    
        class Cell
        {
          public:
            Cell(Main_Array *main = 0, short x = 0, short y = 0);
            ~Cell();
            void disp();
    
          private:
            Main_Array *m_main;
            short m_x;
            short m_y;
        };
    
        #endif
    
    #endif

     Voici le genre de message d'erreur que je trouve dans ma console (g++ dans WSL) :

    In file included from My_File_Main.cpp:27:
    My_File.h:46:21: error: ‘Sub_Array’ was not declared in this scope
       46 |         std::vector<Sub_Array*> m_Sub_Arrays_list;
          |                     ^~~~~~~~~
    My_File.h:46:31: error: template argument 1 is invalid
       46 |         std::vector<Sub_Array*> m_Sub_Arrays_list;
          |                               ^
    My_File.h:46:31: error: template argument 2 is invalid
    My_File.h:47:21: error: ‘Col’ was not declared in this scope
       47 |         std::vector<Col*> m_Cols_list;
          |                     ^~~
    My_File.h:47:25: error: template argument 1 is invalid
       47 |         std::vector<Col*> m_Cols_list;
          |                         ^
    My_File.h:47:25: error: template argument 2 is invalid
    My_File.h:48:21: error: ‘Line’ was not declared in this scope
       48 |         std::vector<Line*> m_Lines_list;
          |                     ^~~~
    My_File.h:48:26: error: template argument 1 is invalid
       48 |         std::vector<Line*> m_Lines_list;
          |                          ^
    My_File.h:48:26: error: template argument 2 is invalid
    My_File.h:49:21: error: ‘Cell’ was not declared in this scope
       49 |         std::vector<Cell*> m_Cells_list;
          |                     ^~~~
    My_File.h:49:26: error: template argument 1 is invalid
       49 |         std::vector<Cell*> m_Cells_list;
          |                          ^
    My_File.h:49:26: error: template argument 2 is invalid
    In file included from My_File.cpp:10:
    My_File.h:46:21: error: ‘Sub_Array’ was not declared in this scope
       46 |         std::vector<Sub_Array*> m_Sub_Arrays_list;
          |                     ^~~~~~~~~
    My_File.h:46:31: error: template argument 1 is invalid
       46 |         std::vector<Sub_Array*> m_Sub_Arrays_list;
          |                               ^
    My_File.h:46:31: error: template argument 2 is invalid
    My_File.h:47:21: error: ‘Col’ was not declared in this scope
       47 |         std::vector<Col*> m_Cols_list;
          |                     ^~~
    My_File.h:47:25: error: template argument 1 is invalid
       47 |         std::vector<Col*> m_Cols_list;
          |                         ^
    My_File.h:47:25: error: template argument 2 is invalid
    My_File.h:48:21: error: ‘Line’ was not declared in this scope
       48 |         std::vector<Line*> m_Lines_list;
          |                     ^~~~
    My_File.h:48:26: error: template argument 1 is invalid
       48 |         std::vector<Line*> m_Lines_list;
          |                          ^
    My_File.h:48:26: error: template argument 2 is invalid
    My_File.h:49:21: error: ‘Cell’ was not declared in this scope
       49 |         std::vector<Cell*> m_Cells_list;
          |                     ^~~~
    My_File.h:49:26: error: template argument 1 is invalid
       49 |         std::vector<Cell*> m_Cells_list;

     Merci par avance ;),





    -
    Edité par champax1 24 juillet 2020 à 21:15:31

    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2020 à 21:54:33

      Les messages d'erreurs semble clair, dans le prototype de ta classe Main_Array Les types Sub_ArrayColLineCell  ne sont pas encore connu !
      • Partager sur Facebook
      • Partager sur Twitter
        24 juillet 2020 à 23:27:31

        Mais si je les déclare dans le même fichier ? Je ne comprends pas comment je pourrais faire autrement... Désolé @rouloude je suis pas un foudre en C++, mais j'aimerais comprendre comment les introduire de manière plus explicite... Ou en tout cas de manière à ce qu'ils soient reconnus dans le proto de ma classe Main_Array.

        -
        Edité par champax1 24 juillet 2020 à 23:30:49

        • Partager sur Facebook
        • Partager sur Twitter
          24 juillet 2020 à 23:48:30

          Solution: Declaration anticipée

          Tes vector de pointeurs, ca sent la fuite memoire à plein nez. Utiliser des vector de unique_ptr serait déjà plus prudent.

          • Partager sur Facebook
          • Partager sur Twitter
            25 juillet 2020 à 0:25:04

            Merci @Spaceln, j'ignorais l'existence des déclaration anticipées, j'ai testé et ça fonctionne super bien !!

            Je suis pas un pro des pointeurs (c'est le premier projet ou je les utilise à proprement parler), je me documente et j'essaie d'exploiter ton conseil sur les unique_ptr au mieux !!

            Merci encore !!

            • Partager sur Facebook
            • Partager sur Twitter
              25 juillet 2020 à 1:20:14

              Lu',

              Moi je pense plutôt que tu t'es embêté à créer des dépendances inutiles entre tes classes. Est-ce qu'une cellule/colonne ou sous-tableau à réellement besoin de connaitre à quel tableau initial il/elle appartient? Vu de loin, je dirai que non, mais bon...

              • Partager sur Facebook
              • Partager sur Twitter

              Eug

              vector d'objets dans un prototype de classe

              × 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