En programmation orientée objet, il est souvent nécessaire de passer une fonction membre en argument à une autre fonction. Cependant, faire cela correctement peut être un peu délicat, surtout lors de l'utilisation du pointeur this.
Considérons un exemple spécifique de l'extrait de code fourni :
class testMenu : public MenuScreen { // ... void test2() { draw = true; } }; MenuButton<testMenu> x; testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., &test2); }
Ici, la fonction membre test2 est affecté au membre ButtonFunc du MenuButton à l'aide de la fonction SetButton :
template <class object> void MenuButton::SetButton(..., void (object::*ButtonFunc)()) { this->ButtonFunc = &ButtonFunc; }
Le problème survient lors de l'appel du fonction test2 de la classe MenuButton. Pour ce faire, nous avons besoin à la fois d'un pointeur vers l'objet (c'est-à-dire testMenu) et d'un pointeur vers la fonction (c'est-à-dire &test2). Dans la version modifiée de SetButton :
template <class object> void MenuButton::SetButton(..., object *ButtonObj, void (object::*ButtonFunc)()) { this->ButtonObj = ButtonObj; this->ButtonFunc = ButtonFunc; }
Nous passons une référence à l'objet, accessible à l'aide du pointeur ButtonObj. Le pointeur de fonction membre est ensuite invoqué en utilisant ((ButtonObj)->*(ButtonFunc))().
Enfin, le constructeur testMenu corrigé :
testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., this, &test2); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!