En tentant de faire un GUI, je me suis rendu compte de quelques problèmes :
Considérons la classe ci-dessous (donnée avec le GUI)
Pas de problème dans ce cas ci car CHANGED est bien rajouté après les autres Event de Button ; ainsi, ils interfèrerons pas.
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 class Button : public Objet { private : //Choses hérités de Objets (ne sont pas réellement présents std::vector<Callback> Callbacks; void handle_event(Evenement*evenement) { for(unsigned int i=0;i<Callbacks.size();i++) { if(Callbacks[i].get_event()==evenement->get_event()) Callbacks[i](evenement); } } //Choses spécifiques au bouton (par exemple la police, le fond, ... ne sont pas indiqué ici public : //Les constructeurs ne sont pas présentés mais ils connectent tous ce dont il y a besoin enum Event{PRESSED,UNPRESSED,CLIKED, REDIM};//Ceci n'est qu'un exemple inline void emit(Evenement*evenement) { handle_event(evenement); safe_delete(evenement); } inline void connect(Function fc, int Declanch/*En réalité un Event*/) { Callbacks.push_back(Callback(fc,Declanch)); } }; class My_Button : public Button//On souhaite rajouter un type d'evenement { private : //Que ce qui est hérité de Button public : enum Event{PRESSED,UNPRESSED,CLIKED, REDIM, CHANGED/*Attention*/};//On utilise le masquage pour introduire de nouveaux Event };
Cependant, dans les 2 cas ci-dessous il y a un problème :
Hors, je ne peux demander a mon utilisateur de connaitre tous les Event prédéfinis de ma classe Button et de les recopier puis rajouter les nouveaux.
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 class My_Button : public Button//On souhaite rajouter un type d'evenement { private : //Que ce qui est hérité de Button public : enum Event{PRESSED,CHANGED/*Attention*/,UNPRESSED,CLIKED, REDIM};//On utilise le masquage pour introduire de nouveaux Event }; class My_Button : public Button//On souhaite rajouter un type d'evenement { private : //Que ce qui est hérité de Button public : enum Event{PRESSED, REDIM, CHANGED/*Attention*/};//On utilise le masquage pour introduire de nouveaux Event };
Ce qu'il faudrait, c'est pouvoir faire enum My_Button_Event{Button_Event,CHANGED}; auquel cas, chaque objet aurait pour Event : enum object_name(parent_object_name,Evenement propre à l'objet).
A ma surprise un tel code compile :
Mais malheureusement affiche 012310 et non 01234 avec une erreur de compilation pour Button_Event
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <iostream> using namespace std; enum Button_Event{PRESSED,RELEASED,CLICKED,REDIM}; enum My_Button_Event{Button_Event,CHANGED}; int main() { std::cout<<PRESSED<<RELEASED<<CLICKED<<REDIM<<CHANGED<<Button_Event;//Ne devrais pas compiler avec ce dernier cout return 0; }
Comment pallier à ce problème ?
Partager