Forum Clubic

Tableau d'objet et polymorphie en C++

Bonjour,

Le but de mon programme est de créer des géométries soit un cercle, un rectangle, …, et de les stocker dans un tableau se trouvant dans une structure. Donc je veux obtenir une structure avec un tableau contenant par exemple un cercle et deux rectangles.

J’ai créé deux classes et une structure, une classe nommée “Circle” et l’autre “Geometry”, et la structure nommée “sLayer”. J’utilise le polymorphisme pour lier les deux classes :

struct sLayer
{
std::string name;
std::vector tab_geom;
};

class Geometry
{
private :

public :
	virtual void print_info();

};

class Circle : public Geometry
{
private :
string name;
string layer;//Couche associe a un keepout
Coordinate center;
float diameter;
float width;
bool fill;//0=vide 1=plein

public :
	Circle(Coordinate coo_tmp,float diameter_tmp,float width_tmp) : center(coo_tmp),diameter(diameter_tmp),fill(0){}
	Circle();
	~Circle();
	virtual void print_info();

};

void Geometry::print_info()
{
cout << “Geometry :” << endl;
}

void Circle::print_info()
{
cout << “Circle :” << endl;
}

int main()
{

for(int d=int_begin; d<int_end+1; d++)
	{
	Geometry *obj_geom_tmp=new Geometry();
	obj_geom_tmp=new Circle("0;0",0.2);
	
	//Affichage
	obj_geom_tmp->print_info();   //A
	struct_layer_tmp.tab_geom.push_back(*obj_geom_tmp);   //B
	struct_layer_tmp.tab_geom.at(struct_layer_tmp.tab_geom.size()-1).print_info();   //C
	
	}
}

Mon probléme est que en A ça affiche “Circle :”, donc pour l’affichage on utilise bien l’objet associé au pointeur pour appeler la fonction et non le pointeur lui même. Mais quand je stocker le pointeur dans le tableau d’objet de la structure en B et que j’utilise l’élément du tableau pour l’affichage, ça utilise le pointeur et pas le type d’objet et ça m’affiche “Geometry :”.
Qu’est ce que j’ai mal fait pour que la polymorphie ne soit plus active quand je stock mes éléments ?

En espérant avoir été assez claire dans mes explications, merci pour les réponses futures.
Edité le 06/06/2011 à 14:28

J’ai trouvé la solution, j’ai remplacer le tableau d’objet de type “Geometry” dans la structure par un tableau de pointeur sur des objet de type “Geometry”.

Seule changement dans le reste du code, c’est que l’accès aux fonctions ne se fait plus avec un point mais avec une flèche.

De cette façon le polymorphisme est toujours présent.

Tu peux éviter l’appel par pointeur dans les fonctions en utilisant une référence. Par contre, dans le tableau, là pas le choix :slight_smile: