begin process at 2012 05 28 15:47:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Liste chainée d'objets de classes différentes


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Liste chainée d'objets de classes différentes

mercredi 16 juillet 2003 à 14:58:23 | Liste chainée d'objets de classes différentes

gillig

Voici un problème auquel je ne trouve pas de réponse, enfin, rien d'efficace.
J'ai une classe CDessin contenant une liste chaînée (CList) de pointeurs d'objets CForme. Je voudrais ajouter une méthode Ajout(CForme *pForme), à laquelle je passerais des pointeurs vers des objets dérivés de CForme, disons CCarre, CSphere, CLigne, etc. Jusque là, rien de compliqué (liste.AddTail(pForme)).
Mais ça se complique. Je souhaiterais NE PAS ajouter une sphère qui aurait le même centre et le même rayon qu'une autre déjà présente. Donc, dans le parcours de la liste à la recherche d'un éventuel doublon, il faut 1) ne pas se préoccuper des objets de classe différente, et 2) pour des objets de même classe, les comparer en fonctions de critères spécifiques à la classe.
Comment faire ?
Voici les solutions auxquelles j'ai pensé :
- 1 liste chainée par classe + 1 méthode d'ajout par classe. Bof...
- 1 liste chainée par classe + 1 switch sur le type de pForme*. Bof pareil...
- 1 seule liste, et surcharger les opérateurs == pour toutes les sous-classes de CForme et en faisant toutes les combinaisons. Lourd, et d'ailleurs je ne suis pas sûr que ça puisse marcher...
Merci d'avance pour votre aide ! J'ajoute que je suis un peu pressé...
mercredi 16 juillet 2003 à 17:35:20 | Re : Liste chainée d'objets de classes différentes

Kaid

Désolé, mais tu es obligé de définir l'opérateur de comparaison == dans la classe CForme et toutes ses sous-classes sinon impossible de savoir si deux formes ont des caractéristiques identiques.

Sinon pour l'ajout, la meilleure manière de procéder (une liste avec tous les types d'objets, n listes) dépend de la quantité d'objets CForme que tu vas manipuler.

Kaid - kaid.fr.st
-------------------------------
Réponse au message :
-------------------------------

> Voici un problème auquel je ne trouve pas de réponse, enfin, rien d'efficace.
> J'ai une classe CDessin contenant une liste chaînée (CList) de pointeurs d'objets CForme. Je voudrais ajouter une méthode Ajout(CForme *pForme), à laquelle je passerais des pointeurs vers des objets dérivés de CForme, disons CCarre, CSphere, CLigne, etc. Jusque là, rien de compliqué (liste.AddTail(pForme)).
> Mais ça se complique. Je souhaiterais NE PAS ajouter une sphère qui aurait le même centre et le même rayon qu'une autre déjà présente. Donc, dans le parcours de la liste à la recherche d'un éventuel doublon, il faut 1) ne pas se préoccuper des objets de classe différente, et 2) pour des objets de même classe, les comparer en fonctions de critères spécifiques à la classe.
> Comment faire ?
> Voici les solutions auxquelles j'ai pensé :
> - 1 liste chainée par classe + 1 méthode d'ajout par classe. Bof...
> - 1 liste chainée par classe + 1 switch sur le type de pForme*. Bof pareil...
> - 1 seule liste, et surcharger les opérateurs == pour toutes les sous-classes de CForme et en faisant toutes les combinaisons. Lourd, et d'ailleurs je ne suis pas sûr que ça puisse marcher...
> Merci d'avance pour votre aide ! J'ajoute que je suis un peu pressé...
>
jeudi 30 octobre 2003 à 03:22:00 | Re : Liste chainée d'objets de classes différentes

gillig

Merci pour ta réponse rapide. Je me suis débrouillé comme je pouvais avant de ... laisser passer un peu de temps et continuer de chercher.

J'ai envisagé d'abord la possibilité de définir un énuméré ({CERCLE, CARRE, ...}) et de m'en servir comme base pour reconnaitre 2 objets de même classe. Mais bon...

Je crois avoir trouvé une meilleur solution en utilisant l'opérateur typeid, qui récupère dynamiquement le type, et qui fourni non seulement un opérateur == , mais aussi une méthode "before" censée indiquer si les 2 classes font partie de la même hiérarchie :

bool CForme::EstMemeClasseOuSousClasse(const CForm *f)
{
const type_info &t1 = typeid(*this);
const type_info &t2 = typeid(*f);
return (t1 == t2 || t2.before(t1));
}

bool CSphere::operator==(const CForme &f)
{
if (EstMemeClasseOuSousClasse(&f))
{
CSphere *f2 = (CSphere *) &f;
return (_rayon==f2->_rayon && ...);
}
return false;
}

CForme * CMoteur::Ajout(CForme *pForme)
{
if (!pForme) return;
POSITION pos = _lstFormes.GetHeadPosition();
bool trouve = false;
int i = _lstFormes.GetCount();
while (i-- > 0 && !trouve)
{
CForme *f = _lstFormes.GetNext(pos);
trouve = (*pForme == *f);
}
...
}

NB : cocher la case Enable Run-Time Type Information (RTTI) dans les options de compilation


Cette discussion est classée dans : liste, classe, objets, chainée, cforme


Répondre à ce message

Sujets en rapport avec ce message

Probleme de taille d'une liste chainee static qui varie ... [ par rick_moins_moins ] Bonjour,j'ai besoin de faire  une liste chainee dans mon programme afin de cataloguer tous les objets de mon projet. Pour cela ma liste chainee est st classe liste [ par programe_smi ] on m'a demandé de réaliser une classe "liste" de listes chaînées comportant des objets de types différents pour cela on m'a dmandé de creer une classe Liste comportant une classe template [ par horcks ] Bonjour, J'aurais voulu savoir s'il est possible de créer une liste contenant une classe template. Je m'explique : Voici le code (écourté) du template Fichier + liste chainée [ par Evisu ] Bonsoir,J'ai une question concernant l'écriture et la lecture de liste chainée dans un fichier.dataJ'ai une structure PERS qui contient des infos (nom table de hachage et liste chainée [ par cyrina84 ] bonjour à tous, je voudrais bien  savoir  comment créer une application d'apprentissage automatique.on m'a demandé de réaliser une application qui per liste chainée [ par zitiba ] Salut! je m'appelle josiane.Je suis au burkina .j'ai un problème et je voudrais de l'aideEn faite on me demande de faire une liste chainée de caractèr Interaction entre objets [ par kharrat ] Salut,Je cherche à implémenter une relation d'association 1-1 entre 2 objets de 2 classes différentes.Mon code:--------------------------------------- Recherche de la plus grand valeur dans une liste chainée [ par doudou0088 ] Bonjour, J'ai une liste chainé contenant une valeur entière pour chaque élément (environ 96 éléments). J'aimerai affiché l'entier le plus grand de cet Trier une liste simplement chainée [ par MasterShadows ] Bonjour à tous,Dans un TP de C que je dois, il y'a une question qui me perturbe :Nous devions créer une structure LIST qui est simplement chainée, qui Répertoire téléphonique en Liste Chainée [ par REQVIEM ] Bonjour,Je suis en école d'ingé et on a un projet a réaliser en C. On doit réaliser un Répertoire téléphonique en Liste Chainée de structure à partir


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,137 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales