Enum, Héritage, Concaténation, Masquage
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:
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:
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:
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 ?