Le sujet a probablement déjà été évoqué ici, mais je ne trouve pas (suis
pas doué pour trouver les mots-clés).
J'ai l'arborescence :
CAbs : classe abstraite
CDer1 : public CAbs
CDer2 : public CAbs
CDerDer1 : public CDer1
etc.
Tous les objets ont un constructeur de recopie et un operator= .
Je gère une liste de pointeurs de CDer... :
std::list<CAbs *> liste;
Jusque là, tout va bien :)
Je voudrais créer une liste2 qui contienne des pointeurs vers des copies
des CDer... pour pouvoir modifier les objets en préservant les
originaux, et là, je sèche :(
Donc si quelqu'un pouvait m'indiquer la bonne voie.
Actuellement je m'en sors en ayant ajouté une méthode getType() à tous
les objets et en faisant un new CDer... adapté à chaque cas. Il doit
bien y avoir une méthode générique moins lourde et surtout qui s'adapte
toute seule aux évolutions de l'arborescence. Je soupçonne les
dynamic_cast de servir à cela, mais je n'arrive pas à les utiliser
correctement.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
espie
In article <48e8918a$0$5751$, jaz wrote:
Bonjour
Le sujet a probablement déjà été évoqué ici, mais je ne trouve pas (suis pas doué pour trouver les mots-clés).
J'ai l'arborescence : CAbs : classe abstraite CDer1 : public CAbs CDer2 : public CAbs CDerDer1 : public CDer1 etc.
Tous les objets ont un constructeur de recopie et un operator= .
Je gère une liste de pointeurs de CDer... : std::list<CAbs *> liste;
Jusque là, tout va bien :)
Je voudrais créer une liste2 qui contienne des pointeurs vers des copies des CDer... pour pouvoir modifier les objets en préservant les originaux, et là, je sèche :(
Donc si quelqu'un pouvait m'indiquer la bonne voie.
Actuellement je m'en sors en ayant ajouté une méthode getType() à tous les objets et en faisant un new CDer... adapté à chaque cas. Il doit bien y avoir une méthode générique moins lourde et surtout qui s'adapte toute seule aux évolutions de l'arborescence. Je soupçonne les dynamic_cast de servir à cela, mais je n'arrive pas à les utiliser correctement.
Il y a effectivement une methode canonique:
il te faut un `constructeur du bon type', en l'occurrence une methode virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie de this... et dont le type evoluera selon l'endroit ou tu te situe dans ta hierarchie de classes.
In article <48e8918a$0$5751$426a74cc@news.free.fr>,
jaz <jaz@pasdespam.jaz> wrote:
Bonjour
Le sujet a probablement déjà été évoqué ici, mais je ne trouve pas (suis
pas doué pour trouver les mots-clés).
J'ai l'arborescence :
CAbs : classe abstraite
CDer1 : public CAbs
CDer2 : public CAbs
CDerDer1 : public CDer1
etc.
Tous les objets ont un constructeur de recopie et un operator= .
Je gère une liste de pointeurs de CDer... :
std::list<CAbs *> liste;
Jusque là, tout va bien :)
Je voudrais créer une liste2 qui contienne des pointeurs vers des copies
des CDer... pour pouvoir modifier les objets en préservant les
originaux, et là, je sèche :(
Donc si quelqu'un pouvait m'indiquer la bonne voie.
Actuellement je m'en sors en ayant ajouté une méthode getType() à tous
les objets et en faisant un new CDer... adapté à chaque cas. Il doit
bien y avoir une méthode générique moins lourde et surtout qui s'adapte
toute seule aux évolutions de l'arborescence. Je soupçonne les
dynamic_cast de servir à cela, mais je n'arrive pas à les utiliser
correctement.
Il y a effectivement une methode canonique:
il te faut un `constructeur du bon type', en l'occurrence une methode
virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie
de this... et dont le type evoluera selon l'endroit ou tu te situe dans
ta hierarchie de classes.
Le sujet a probablement déjà été évoqué ici, mais je ne trouve pas (suis pas doué pour trouver les mots-clés).
J'ai l'arborescence : CAbs : classe abstraite CDer1 : public CAbs CDer2 : public CAbs CDerDer1 : public CDer1 etc.
Tous les objets ont un constructeur de recopie et un operator= .
Je gère une liste de pointeurs de CDer... : std::list<CAbs *> liste;
Jusque là, tout va bien :)
Je voudrais créer une liste2 qui contienne des pointeurs vers des copies des CDer... pour pouvoir modifier les objets en préservant les originaux, et là, je sèche :(
Donc si quelqu'un pouvait m'indiquer la bonne voie.
Actuellement je m'en sors en ayant ajouté une méthode getType() à tous les objets et en faisant un new CDer... adapté à chaque cas. Il doit bien y avoir une méthode générique moins lourde et surtout qui s'adapte toute seule aux évolutions de l'arborescence. Je soupçonne les dynamic_cast de servir à cela, mais je n'arrive pas à les utiliser correctement.
Il y a effectivement une methode canonique:
il te faut un `constructeur du bon type', en l'occurrence une methode virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie de this... et dont le type evoluera selon l'endroit ou tu te situe dans ta hierarchie de classes.
jaz
Marc Espie a écrit :
il te faut un `constructeur du bon type', en l'occurrence une methode virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie de this... et dont le type evoluera selon l'endroit ou tu te situe dans ta hierarchie de classes.
Je résume ce que j'ai compris :
Classe de base abstraite : class CAbs { virtual CAbs* clone() = 0; ... };
Classes dérivées : class CDer1 : public CAbs { CDer1(const CDer1 & model) { // constructeur de recopie (déjà présent) }
virtual CDer1* clone() { return new CDer1(*this); } ... };
...idem pour les autres...
C'est en effet bien plus souple à l'utilisation que ma bidouille précédente.
Merci pour la réponse et pour sa rapidité, A+ Jacques
Marc Espie a écrit :
il te faut un `constructeur du bon type', en l'occurrence une methode
virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie
de this... et dont le type evoluera selon l'endroit ou tu te situe dans
ta hierarchie de classes.
Je résume ce que j'ai compris :
Classe de base abstraite :
class CAbs
{
virtual CAbs* clone() = 0;
...
};
Classes dérivées :
class CDer1 : public CAbs
{
CDer1(const CDer1 & model) {
// constructeur de recopie (déjà présent)
}
virtual CDer1* clone() {
return new CDer1(*this);
}
...
};
...idem pour les autres...
C'est en effet bien plus souple à l'utilisation que ma bidouille précédente.
Merci pour la réponse et pour sa rapidité,
A+
Jacques
il te faut un `constructeur du bon type', en l'occurrence une methode virtuelle que tu peux appeler par exemple clone(), qui te fabrique une copie de this... et dont le type evoluera selon l'endroit ou tu te situe dans ta hierarchie de classes.
Je résume ce que j'ai compris :
Classe de base abstraite : class CAbs { virtual CAbs* clone() = 0; ... };
Classes dérivées : class CDer1 : public CAbs { CDer1(const CDer1 & model) { // constructeur de recopie (déjà présent) }
virtual CDer1* clone() { return new CDer1(*this); } ... };
...idem pour les autres...
C'est en effet bien plus souple à l'utilisation que ma bidouille précédente.
Merci pour la réponse et pour sa rapidité, A+ Jacques