Envoyé par
Bousk
Ben à part du dynamic_cast tu n'auras absolument aucun moyen d'appeler une méthode de Circle sur un Node. Et vu que Rect et Circle n'ont strictement rien à voir..
Je pense aussi, mais ma question portait plus sur le fait de savoir s'il y avait un moyen ou pas d'encapsuler ce casting dans quelque chose qui permettrait que ça se fasse automatiquement, sans avoir à le spécifier explicitement dans le code à chaque fois qu'on veut accéder à un Node.
L'idée globale était:
- de remplacer "Node* getChild(int index)" par quelque chose de la forme "NodePtrWrapper getChild(int index)"
- que cette struct NodePtrWrapper propose autant d'opérateurs de conversion implicite) de type que les sous classes disponibles (Rectangle, Cercle, ...):
1 2 3 4 5 6 7 8 9
|
class NodePtrWrapper {
public:
NodePtrWrapper(Node* node) : nodePtr(node) {}
operator Rectangle*() const { return(dynamic_cast<Rectangle*>(nodePtr); }
operator Cercle*() const { return(dynamic_cast<Cercle*>(nodePtr); }
private:
Node* nodePtr;
} |
Ainsi, on aurait quelque chose du genre:
Rectangle* rect = parent->getChild(27);
... avec:
- getChild qui retourne le NodePtrWrapper
- NodePtrWrapper qui propose une conversion implicite de lui même vers un Rectangle*
- rect qui reçoit un Rectangle*
et/ou
parent->getChild(21)->setRayon(123);
... avec:
- getChild qui retourne le NodePtrWrapper
- NodePtrWrapper qui propose une conversion implicite de lui-même vers un Cercle*
- setRayon(123) qui est appelé sur un Cercle*
Partager