Bonsoir,
je suis actuellement sur un projet d'outils ecrits en C++ pour la librairie SDL.
Ces outils permettent de cr�er et de manipuler un moteur de jeu, une banque de son, des fichiersde ressources et de configurations, pour faciliter la cr�ation d'un jeu vid�o en 2D. Une bo�te � (GUI)widget est �galement incluse. Mon probl�me survient dans l'interaction entre l'utilisateur et les widgets. L'organisation des classes est la suivante:
- Classe Abstraite Widget.
|-> Menu (h�rite de Widget)
|-> DialogBox (h�rite de Widget)
|-> etc...
Chaque Widget dispose d'un certain nombre de WidgetItem.
- Classe Abstraite WidgetItem
|-> TextLabel (h�rite de WidgetItem)
|-> ImageLabel (h�rite de WidgetItem)
|-> etc...
C'est en interagissant (par double clique) sur les WidgetItem que l'on d�clenche des actions. Chaque widget doit �tre capable de r�aliser une action sp�cifique et dispose donc d'une m�thode "action()" virtuelle pure qu'il faut d�finir dans une classe fille. Il est fastidieux d'�crire une nouvelle classe h�ritant de TextLabel (ou autre classe h�ritant de WidgetItem) pour d�finir l'action sp�cifique � r�aliser.
Ma question est donc la suivante: existe t-il un m�canisme proche de celui du Java en C++ pour cr�er des classes internes anonymes.
Exemple en Java:
La seule solution que j'ai trouv� pour l'instant est de d�clarer comme attribut dans la classe WidgetItem un pointeur de fonction.
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 public interface Action { void do_something(); } ... public class TextLabel { private Action action; public void add_action(Action a) { action = a; } public void action() { a.do_something(); } } ... public class Menu { private int a; private TextLabel label; public Menu() { label = new TextLabel(); label.add_action( new Action() { void do_something() { // implémentation de l'interface // la classe interne a accès aux éléments de Menu a++; } }); label.action() // augmente le membre "a" de 1 label.add_action( new Action() { void do_something() { // implémentation de l'interface // la classe interne a accès aux éléments de Menu a--; } }); label.action() // reduit le membre "a" de 1 } }
On obtient alors en C++:
Cette m�thode arrive vite � ses limites lorsque l'action � r�aliser doit avoir acc�s aux membres d'autres objets..
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 class WidgetItem { public: ... void set_action(void (*f)(void)) { function = f; } void action() { function(); } private: void (*function)(void); }; ... void do_something() { printf("Action"); } ... void do_something_else() { printf("Another Action"); } ... // dans le main WidgetItem i(); i.set_action(do_something); i.action(); // Affiche sur le terminal "Action" i.set_action(do_something_else); i.action(); // Affiche sur le terminal "Another Action"
Je suis � l'�coute de toutes vos solutions aussi "bidoullage" soient-elles.
Merci d'avance !
Partager