Bonjour j'ai longtemps cherché avant de tomber sur ce poste qui je pense correspond à mon problème mais n'y répond pas tout à fait.
Je suis débutante en C++ ainsi qu'en POO, et je n'ai encore jamais crée de template.
Voilà mon problème:
J'aimerai implémenter le pattern visiteur en c++, pour cela j'ai crée une interface IVistor et j'implémente la classe CPGResolutionVisitor qui hérite de mon interface. Jusque là tout va bien.
Ensuite arrive le gros problème. Parmi les objets que mon visiteur doit visiter il y a des objets abstraits. Et en fonction de la structure d'objets que je crée je veux que mon visiteur visite les classes filles de mes classes abstraites. Or avec une interface je déclare des fonctions virtuelles pure, et je dois conserver exactement la même signature dans mes classes filles, ce qui n'est pas le cas ici.
Faut-il donc qu'en plus d'hériter de IVisitor, ma classe CPGResolutionVisitor hérite aussi de Network, Node et IBody ?
Mon autre problème c'est que mon visiteur concret quand il va aller visiter les objet de type Network, Node et IBody doit pouvoir acceder a des éléments qui sont spécifiques aux classes filles, donc si dans la classe CPGResolutionVisitor je laisse les type de base au lieu des types spécifiques Neuron, NaoBody, CPG je ne pourrais pas dans l'implémentation de la fonction visit faire ce que je veux faire ! Alors que faire ? (désolé pour la rime pourri)
C'est peut-être un peu brouillon, j'avoue que j'ai un peu de mal à organiser ma pensée. J'éspère ne pas m'être trompé d'endroit pour poster (j'ai préféré venir sur un post similaire au mien plutôt que d'en créer un nouveau où on me dirait de venir voir ici).
Merci d'avance pour votre aide aussi infime soit-elle.
Dans le cas du CPGResolutionVisitor, mon Network est de type CPG, mon Node est de type Neuron et mon IBody est de type NaoBody.
voilà mon code :
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 IVisitor { public: virtual void visit(Node* node)=0; virtual void visit(Layer* layer) = 0; virtual void visit(Network* net)=0; virtual void visit(System* sys) = 0; virtual void visit(IBody* body)=0; }; class CPGStateResolutionVisitor: public IVisitor { public: CPGStateResolutionVisitor(); CPGStateResolutionVisitor(double t0); virtual ~CPGStateResolutionVisitor(); void visit(Neuron* node); void visit(Layer* layer); void visit(CPG* net); void visit(System* sys); void visit(NaoBody* body); };
Partager