Bonjour,

je débute en C++ et je suis fasse à un problème depuis hier soir et je n'arrive pas à trouver une solution "propre".

Alors j'ai un singleton EventMovement, et une classe Main_controller.
Depuis Main, je cherche à faire quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Main_controller::Main_controller(void){
    EventMovement *eventMovement;
    eventMovement = EventMovement::getInstance ();
 
    //Ce que je cherche à faire :
    eventMovement->addEventListener("haut_bas", maFonction);
}
 
void Main_controller::maFonction(void){
    autreFonctionDeMain();
}
et dans mon singleton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
void addEventListener(std::string event_, void(*func_)(void)){
            func_();
}

Mais évidemment ça ne marche pas... J'avais espéré qu'en passant la fonction par référence, ça marcherai tout seul ;-) Mais comme j'ai pas encore tout compris aux références, adresses,...

Finalement j'ai trouvé une solution, mais qui est un peu... crade :

Main_controller :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Main_controller::Main_controller(void){
    EventMovement *eventMovement;
    eventMovement = EventMovement::getInstance ();
 
    eventMovement->addEventListener(this, "haut_bas", Main_controller::maFonction);
}
 
static void Main_controller::maFonction(Main_controller *_this){
    _this->autreMethodeDeMain();
}
par contre du côté du singleton, le problème est que je dois connaitre le type des arguments, et du coup importer le Main_controller.h. Il faudra alors que je crée autant d'addEventListener que de classe qui l'utiliseront... Ce n'est pas très pratique :

Singleton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
void addEventListener(Main_controller*objet, std::string event_, void(*func_)(Main_controller *_this)){
            func_(objet);
}
A votre avis, comment pourrais-je faire ? N'y a-t'il pas moyen de faire plus simple ? ou peut-on passer un argument dont le type est inconnu (ce serait déjà pas mal) ?

Merci beaucoup de votre aide,
à bientôt