HS_Dino " Il n´y a pas de problèmes."
![]()
" Dis plutot ce que tu souhaiterais obtenir et que tu n´obtients pas."
Ce que je souhaite obtenir :
J´ai une classe CIcone auquelles sont derivé deux autres classe CIconeFeu et CIconesFleches. Elles ont les caracteristiques d´un sauf qu´un sert a faire une ligne de feu et l´autre une fleche. Elles continenent chacune leur propre methode afficher. J´ai une classe CModif qui contient differentes caracteristiques, dont un objet de type CIcone. Je voudrai donc mettre dans cet objet un CIcone, un CIconeFeu ou un CIconeFleche et que lorsque je fait la methode afficher de cette objet, il m´appele la fonction afficher de la bonne classe
Pour l´instant, il m´appelle uniquement la methode afficher du CIcone ( j´ai verifié avec le debugueur)
Le probleme vient peut-etre du fait que j´utilise une CListe de CModif que je parcour en faisant a chaque fois afficher pour son CIcone
Sinon, en remplacement du dynamic_cast, y a-t-il une autre solution ?
Il manque le mot CIcone :
( ...)caracteristiques d´un CIcone sauf qu´un sert(...)
![]()
A la place de la liste qui vient des mfc pourquoi ne pas utiliser la liste de STL ?
voila un petit exemple qui devrait marcher
Si j´ai bien compris, c´est ce que tu veux faire
using namespace std;
class A
{
public:
virtual void aff(){cout<<"a\n";}
};
class B:public A
{
public:
virtual void aff(){cout<<"b\n";}
};
class C:public A
{
public:
virtual void aff(){cout<<"c\n";}
};
int main()
{
list<A*> l;
A* a=new A;
A* b= new B;
A* c= new C;
l.push_back(a);
l.push_back(b);
l.push_back(c);
list<A*>::iterator it;
for(it=l.begin();it!=l.end();++it)
{
(*it)->aff();
}
return 0;
};
maxime999 > Comment veux tu faire du polymorphisme sans pointeurs?
Donc, obliger de faire par pointeur? ok, c´est noté ![]()
J´utilisait les CListe car mes classes ont besoin d´etre serialisé, mais vu comment les CListe me font chier, je vais passer à la STL.
L´exemple est pas exactement ce que je veux : moi c´est une liste d´objet D qui contient un objet A, B ou C.
Mais le principe y est, donc merci
![]()
Mais avec les pointeurs, j´ai toujours le meme probleme avec le constructeur de copie de la classe contenant un objet de type A* :
Je doit recréer le pointeur m_objet de type A*
je fait :
D(const D &){
/ /On s´occupe des autres données membres
if(original.m_objet){ / / si l´objet existe
m_objet=new A; / / Arg, il me fait forcement un A
m_objet=original.m_objet;
}
else
m_objet=NULL;
}
Probleme : il me fera donc un new A meme si c´est un objet B ou C.
kookii m´avait parlé de dynamic_cast, mais Dino a dis que c´etait pas tres bon... Quelle est la meilleure solution ?
m_objet=new A; / / Arg, il me fait forcement un A
m_objet=original.m_objet;
Oula ! Stop ! Grosse erreur !
Tu alloues un objet, puis 1 ligne après tu l´oublies dans l´espace intersidérale de la mémoire. Si tu veux copier un objet, il faut faire *m_objet = *original.m_objet;
Bien evidement, on considere que cette classe m_objet n´a pas de pointeur dans ces membres, sinon il y a duplication de pointeur et ca va se terminer en Access Violation.
Mais bon, il y a un problème général de conception dans tout ton code. Il faut absolument que tu nous donnes ton programme et de nous dire là ou ca ne fait pas ce que tu veux.
pour les CListe, ca sera pareil avec la STL. Si tu as commencé avec les MFC, fini avec les MFC, c´est du pareil au meme, surtout si tu as besoin des services des MFC comme la serialization, etc...
il y a un problème général de conception dans tout ton code
Je reprend les cours demain, mais je vais essayer de mettre le projet en ligne, en commentant le mieux possible pour que vous compreniez bien ce que le projet doit faire.
Merci de votre aide ![]()
Il y a effectivement un probleme de conception.
En y reflechissant, je pense avoir trouvé une meilleure façon de faire. Dites moi ce que vous en pensez, que je ne parte pas une nouvelle fois sur une voie de garage :
avant :
class A : public Cobjet
class B : public A
class C : public A
class D : public Cobjet, contient un pointeur vers un A
maintenant :
class D : public Cobjet
class A : public D
class B : public A
class C : public A
Comme ça, au lieu de faire une liste de D qui contient un A*, j´ai une liste de D* qui peut contenir un D*,un A*(cad un D* avec des truc en +),un B* ou un C* ( cad un A*avec des truc en +).
Dites moi ce que vous en pensez, que je ne parte pas une nouvelle fois sur une voie de garage
Tu pars sur une voie de garage.
Ceci :
class A : public Cobjet
class B : public A
class C : public A
class D : public Cobjet, contient un pointeur vers un A
C´est parfaitement correct et de cette manière que ca doit fonctionner, le polymorphisme est là pour çà. Lorsque dans ta liste de A* qui est dans D tu fais un appele à A->Affiche() ceci appele la bonne fonction selon le type si A est un pointeur sur A, B ou C.
Je reprend les cours demain
Tu fais quoi comme étude ?
i_am_the_law > mh, excs javais mal lu
" Tu fais quoi comme étude ? "
Je suis en IUT informatique à Arles, en deusième année. Mon probleme intervient dans le projet tuteuré que je doit rendre dans un peu plus d´un mois...Apres, en stage
http://147.94.176.19/raffin.r/recherche/stages/index_carto.html
" class A : public Cobjet
class B : public A
class C : public A
class D : public Cobjet, contient un pointeur vers un A
C´est parfaitement correct"
Mais j´ai toujours le probleme pour faire le constructeur de copie et l´operateur =.
A moins que je copie le pointeur, sans faire de new.
" Tu pars sur une voie de garage."
Pourquoi ce n´est pas bon ? ( je suis là pour apprendre, alors je veux comprendre mes erreurs pour progresser)
Help ! je rend le projet dans 29 jours !
( c´est stressant la fin d´un projet)
![]()
Personne pour m´aider ?
On peut en discuter sur MSN Messenger, si ca peux t´aider...
hsdino@hotmail.com
Ok, je t´ai rajouté dans mes contacts.
Merci ![]()
Si tu as besoin de copier ta liste, as tu vraiment besoin de duppliquer également les objets qu´elle contient?
Logiquement tu n´as pas besoin.. enfin tout depend de ce que tu veux en faire.
Au pire tu cree une focntion virtuel copy()
et dans cette fonction tu sais qui de quel type il s´agit. Par ex la fct copy de B donnerait
B* nv = new B(....)
nv->...=... ( copie des different parametres)
return nv;
apres si tu veux copier les elements de ta liste tu fais appel a copy
m_objet=orignal->copy();
Mais bon, reflechit bien si qd tu veux copier ta liste, tu as besoin de dupliquer les elements. En general, l´objet n´existe qu´une seule fois. Ton icone est cree une fois pour toute en memoire, et apres tu manipule le pointeur. Tu crees un nv pointeur qui pointe sur lui et tu auras 2 listes identiques. Est-ce bien necessaire d´avoir en memoire 2 fois le meme icone?