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)

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
 
};
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.

Cependant, dans les 2 cas ci-dessous il y a un problème :

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
 
};
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.

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 :

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;
}
Mais malheureusement affiche 012310 et non 01234 avec une erreur de compilation pour Button_Event

Comment pallier à ce problème ?