Bonjour !
Je lis (et relis) le libre de Bjarne Stroutrup The C++ programming language 4th Edition et j'ai un sérieux problème de compréhension de la section 27.4.1 Composing Data Structures p 782.
Bjarne me dit :
Bon ça ok, c'est juste pour mettre dans le contexte.Consider writing a balanced binary tree library. Since we are providing a library to be used by
many different users, we can’t build the type of the user’s (application’s) data into our tree nodes.
We have many alternatives:
Des trois alternatives qu'il propose ensuite, seule la première me pose problème :
Première alternative :
Ce que j'ai compris en première lecture c'est qu'il faisait référence à quelque chose du genre :We could put the user’s data in a derived class and access it using virtual functions. But (...) our interface to the user’s data is not expressed in terms of the user’s type, so we still need to use casts to access it.
En demandant à l'utilisateur de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class Node { Node* fils_droit, *fils_gauche; Data* val; public : Data* getVal(){ return val;} };
Mais alors ce serait à l'utilisateur de faire des cast et de toutes façons il me semble que c'est en fait la troisième alternative que propose Bjarne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Val_double : public Data { double val; }
Du coup j'ai imaginé qu'il voulait dire quelque chose du genre :We could put a Data∗ into our nodes, where Data is a ‘‘universal base class’’ for our data structures. That would solve the type-checking problem(...)
Et que l'on demanderait à l'utilisateur de faire quelque chose du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class Node{ Node* fils_gauche; Node* fils_droit; public : Node(); //Code Mystèrieux pour moi comprenant // Des méthodes virtuelles pour accéder à la 'valeur' du nud mais // Je ne vois pas du tout comment ici sans connaitre le type de la valeur du nud // même en castant (vers quoi ??) };
Pour palier à mon problème de code mystère, j'ai donc imaginé qu'on ferait plutôt quelque chose du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class Tree_double : public Node{ double val; //..... };
Et l'utilisateur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template <typename T> class Node{ Node* fils_gauche; Node* fils_droit; public : Node(); virtual T getVal() const = 0; };
Mais alors, je ne vois plus du tout à quel cast mon ami Bjarne fait référence...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Tree_double : public Node<double> { double val; public : double getVal() const {return val;} };
Bref : je suis paumé.
P.S. : J'ai d'autres problèmes dans la même section mais j'y viendrai après sinon mon post risque de faire 10 pages.
Partager