Question avec les constructeurs de copies

Résolu
cs_OrsE Messages postés 44 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 20 octobre 2005 - 16 juin 2005 à 12:28
cs_OrsE Messages postés 44 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 20 octobre 2005 - 16 juin 2005 à 13:37
Salut tout le monde!

Voilà, j'ai un problème avec des classes, et je voudrais savoir si je peux le solutionner avec un constructeur de copie.

Voilà un exemple de ce que je veux faire, J'ai la classe A, et j'ai
ensuite B,C,D qui dérivent toutes de A. Dans chacune des classe B,C et
D je redéfini des propriétés et des méthodes. j'ai une fonction
générique qui reçoit A*a en paramètre afin d'englober toutes les
classes que je peux recevoir sans distinction de type.

Ce que je veux faire c'est une copie de la classe reçue... seulement si
je fais une copie de ce que j'ai en paramètre, je fais une copie de A,
et non pas de B, C ou D....

Comment je peux faire pour que quand je copie A, en fait je recopie la vrais classe que j'ai passé en paramètre??:

class A

{

...

};

class B:public A


{


...


};

class C:public A


{


...


};

class D:public A


{


...


};

...



B *b = new B();

fonction(b);

...



fonction(A *a)

{

A copie;

//faire une copie de b et non de a

}



Dans cette exemple, si je fais "copie(*a)", j'aurais une copie de "a" et non pas de "b" que j'ai passé en paramètre...

Voilà mon problème, merci...

2 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
16 juin 2005 à 12:47
Déclare une fonction virtuelle dans la classe A du genre :
virtual A* NewCopy();

dans les classes dérivées surcharge cette méthode et fait un truc du genre :
A* B::NewCopy()
{
A* pnew = new B();
... init de pnew avec les attributs de this;
return pnew;
}

même genre de chose avec C et D.

dans ta fonction :
void fonction(A* a)
{
A* pnew = a->NewCopy();
}

=> tu devrait recevoir un nouvel objet du bon type dynamiquement (un delete est à faire dessus par contre)
3
cs_OrsE Messages postés 44 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 20 octobre 2005
16 juin 2005 à 13:37
Oui c la solution que j'ai mise en oeuvre en attendant d'avoir une
éventuelle réponse sur les constructeurs de copie, mais apparament, ce
que je demande n'est pas faisable.

La méthode que tu décrit là fonctionne très bien, donc je vais me
passer des constructeurs de copie, c'était en fait pour savoir si une
telle méthodes existait bien.

Merci
3
Rejoignez-nous