Copie du contenu d'une liste de pointeurs

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
espie
Le #17425611
In article 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.



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
Le #17425851
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
Publicité
Poster une réponse
Anonyme