Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Copie du contenu d'une liste de pointeurs

2 réponses
Avatar
jaz
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.

Merci d'avance,
Jacques

2 réponses

Avatar
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.
Avatar
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