Bonjour.
J'ai un programme contenant une classe Menu (je vous donnerais le .h en dessous) , qui contient un vecteur de Menu_Object. Tout marchait bien jusqu'à l'héritage :
Menu me permettait d'accéder à la classe Menu_Object (via une fonction) est ainsi la fonction virtual actualise.
Dès que j'ai commencé l'héritage en créant une classe Label, fille de Menu_Object, je me suis aperçu d'un problème :
Puisque Menu contenait un vecteur de Menu_Object, comment accéder à la fonction actualise de mon Label puisqu'il est stocké comme un Menu_Object ?
Existe-il une solution sans changer l'architecture ?
Au passage, Menu_Object contient un int type supposé pouvoir m'indiquer si l'objet est un Label ou non.
Dois-je changer mon vecteur de Menu_Object en un vecteur de void* + un vecteur de int contenant le type, puis caster quand j'appel la fonction actualise ?
Voici mon code :
Menu.h
Menu_Object.h
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 #ifndef DEF_MENU #define DEF_MENU #include "Menu_Object.h" #include "Label.h" class Menu { private : vector<Menu_Object> MyMenu; vector<bool(*)(Menu&, void*, void*)> callback_functions; vector<void*>fc_param; void(*exit_function)(Menu&,void*); void*param; BITMAP*tampon; public : Menu(vector<Menu_Object>, void(*exit_function)(Menu&,void*)=NULL); Menu(Menu_Object, void(*exit_function)(Menu&,void*)=NULL); void add_callback_fc(bool (*)(Menu&,void*, void*), void* =NULL); bool do_callback_functions(); void exit_fc(); void add_object(Menu_Object); int get_num_objects(); Menu_Object& get_menu_object(int); bool is_on_object(int,double, double); int is_on_which_object(double,double); void dessiner(); };
et enfin Label.h
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
39
40
41
42
43
44 #ifndef DEF_MENU_OBJECT #define DEF_MENU_OBJECT #include <vector> using std::vector; #include "Rectangle.h" class Menu; class Menu_Object { protected : int type; bool selection; int ordre; bool visible; vector<bool(*)(Menu&,int, void*,void*)>callback_functions; vector<void*> fc_param; Rectangle zone; BITMAP*image_tmp; bool actualiser; public : Menu_Object(int,int,Rectangle&,bool=true); int get_ordre(); int get_type(); void set_ordre(int); bool get_selection(); void set_selection(bool); bool get_visible(); void set_visible(bool);t bool do_callback_functions(Menu&, int, void*); void add_callback_function(bool(*)(Menu&, int, void*, void*), void* =NULL); Rectangle& get_rectangle(); virtual void actualise(); void dessiner(BITMAP*); }; #endif
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
39
40
41
42
43
44 #ifndef DEF_LABEL #define DEF_LABEL #include "Menu_Object.h" #include <alfont.h> #define DEFAULT_FONT "comic sans ms.ttf" #define LABEL_TYPE 1 using namespace std; class Label : public Menu_Object { private : ALFONT_FONT*police; string value; int col_texte; int col_fond_texte; int underlined; public : Label(int,Rectangle&,bool=true); Label(string, ALFONT_FONT*, int,Rectangle&,bool=true); ALFONT_FONT* get_police(); bool set_police(char*); bool set_police(string); bool set_police(ALFONT_FONT*); int get_col_texte(); bool set_col_texte(int); int get_backcol_texte(); void set_backcol_texte(int); bool delete_caract(int, int); bool add_caract(char, int); bool add_caract(char*, int); bool add_caract(string, int); int get_underlined(); bool set_underlined(int); virtual void actualise(); }; #endif
Avez-vous des idées ? Faut-il que je reconsoive toute l'architecture du programme ? Si oui, pouvez-vous me donner une piste ?
Merci de votre aide.
Partager