Bonjour à vous tous!
Mon problème est le suivant. Je tente de créer une liste qui contient des objets différents. Cette liste contenant des objets différents, je me demande comment nouer les objets entre eux.
Je commence par l'énumération des types possibles:
// liste_objet.h
enum Type { CARRE , CERCLE };
J'ai donc :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class liste{
private:
void * pdeb;
void * pfin;
public:
//Fonctions permettant de gérer la liste
void AjouteObjet(Type type);
}; |
Comme vous le voyez, les objets étant de nature différentes, je mes des void *.
Maintenant, si je désire par exemple y nouer un objet carre, et un objet cercle, chacun étant issu d'une classe différente. (Je ne mes pas tout le code puisque je ne pense pas que cela soit nécessaire)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class carre{
private :
void *psuiv;
void *pprec;
public:
//Méthodes
};
class cercle{
private:
void *psuiv;
void *pprec;
public:
//Méthodes
}; |
A ce moment, la définition des classes est faite. Je passe à l'implémentation des méthodes dans liste.cpp
//liste_objet.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include"liste_objet.h"
void liste::AjouteObjet(Type type)
{
void *nouv;
switch(type)
{
case CARRE:
(carre*) nouv;
nouv=new carre;
if(!(this->pdeb)) {
//Ici si il n'y a aucun élément dans la liste, il n'y a aucun problème,
//je ne mes donc pas le code.
}
//Par contre:
else{
//Ici, si je décide d'ajouter un élément par la fin, j'aurai:
//Il faut accéder au champ psuiv et pprec du dernier objet par exemple(on ajoute par la fin). J'aurai besoin de ceci pour nouers les éléments:
this->pfin->psuiv=nouv; //Ici est le problème
nouv->pprec=this->pfin;
nouv->psuiv=NULL;
this->pfin=nouv;
}
break;
case CERCLE:
//Même problème
break;
}
} |
Si je désire accéder à l'élément psuiv du dernier élément, le pointeur pfin étant un void à la base, il ne reconnait pas pfin comme pointant sur un objet carre ou cercle(logique). Ma question est donc la suivante, comment serait-il possible de mettre une liste comme celle-ci en place sans utiliser de void. Pour résoudre le problème des void * j'ai pensé créer une structure:
1 2 3 4 5 6 7
| typedef struct element{
struct element * psuiv;
struct element * pprec;
void * objet;//Pointe vers un objet
Type type;
}element; |
Celle-ci permet de créer la même liste que ci-dessus, mais on plus de void * dans liste, mais bien des element * qui contiennent des .... void *. Comme element contient un type, je pense qu'il ne doit pas être difficile de caster le pointeur. On a donc une liste d'élement dont le contenu est un objet.
Serait-il possible de faire cela autrement et plus facilement par exemple avec des patrons de fonctions et de classe ? J'espère être assez clair. Soyez indulgent, je sais bien que la clarté n'est pas mon fort, mais je fais comme je peux. Poser des questions si vous ne comprenez pas. Merci.
Partager