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