Bonjour à tous.
Dans le cadre d’un problème d’intégration à un ensemble applicatif préexistant je suis confronté au problème suivant de réécriture d’un constructeur de copie :
Je travaille sur une classe A et sur une classe B, avec l’indication que B est une classe virtuelle pure que j’instancie via une classe template. J’ai donc indicativement:
J'ai maintenant ma classe de mise en œuvre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 Class B //une classe virtuelle { protected: //variables public: virtual Void do_work()=0; }; Template <typename implémentation "utile" de la classe Class VeryB: public B { public: VeryB() //constructeur par défaut {} VeryB(_variables) { //affectations diverses } }; class WorkingB: public VeryB<WorkingB> { WorkingB() //le constructeur vide {} WorkingB(_variables) :VeryB<WorkingB>(_variables) { //affectations diverses } void do_work() { return; //un traitement } //recopie WorkingB(_variables) };
Je pensais faire une chose du genre (mais je sais que c’est faux écrit comme ça, c’est juste pour donner l’esprit):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class A() { private: //des variables //et : B* bObj;//A opèrera notamment sur un représentant de B public: A() //le constructeur vide {} A(paramètres) { bObj=new WorkingB(paramètres); //construction de la bonne instance (spécialisation) de B //etc } //ET MON PROBLEME, AU NIVAU DE LA RECOPIE; A(const &objToCopy) { //différentes recopies icis, mais pour le cas du pointeur sur classe abstraite B? //si B avait été une classe standard, j'aurais fait : bObj=new B(*objtocopy)); } } ;
bObj=new static_cast<VeryB>VeryB(*objtocopy>));
L’idée c’est donc que quand j’appelle le constructeur de copie de A, il retrouve le type de la classe implémentée pour B et qu’il me construise bObj à l’aide du pointeur sur le bon constructeur.
Est-ce que je suis sur une voie, voyez-vous une solution?
Merci
Partager