Equivalent en C++ classes internes anonymes en Java
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:
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 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
}
} |
La seule solution que j'ai trouv� pour l'instant est de d�clarer comme attribut dans la classe WidgetItem un pointeur de fonction. :?
On obtient alors en C++:
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
| 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" |
Cette m�thode arrive vite � ses limites lorsque l'action � r�aliser doit avoir acc�s aux membres d'autres objets..:cry:
Je suis � l'�coute de toutes vos solutions aussi "bidoullage" soient-elles :mrgreen:.
Merci d'avance !