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 : 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
    }
}
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 : 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"
Cette m�thode arrive vite � ses limites lorsque l'action � r�aliser doit avoir acc�s aux membres d'autres objets..

Je suis � l'�coute de toutes vos solutions aussi "bidoullage" soient-elles .
Merci d'avance !