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...
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;
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.
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 !!
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...
× 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.
Eug