オブジェクト指向プログラミングでは、多くの場合、メンバー関数を引数として別の関数に渡すことが必要になります。ただし、これを正しく実行するのは、特に this ポインターを使用する場合、少し難しい場合があります。
提供されたコード スニペットから具体的な例を考えてみましょう。
class testMenu : public MenuScreen { // ... void test2() { draw = true; } }; MenuButton<testMenu> x; testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., &test2); }
ここでは、test2 メンバー関数を使用します。 SetButton 関数を使用して MenuButton の ButtonFunc メンバーに割り当てられます:
template <class object> void MenuButton::SetButton(..., void (object::*ButtonFunc)()) { this->ButtonFunc = &ButtonFunc; }
test2 を呼び出すときに問題が発生します。 MenuButton クラスの関数。これを行うには、オブジェクトへのポインター (つまり、testMenu) と関数へのポインター (つまり、&test2) の両方が必要です。 SetButton の修正バージョンでは:
template <class object> void MenuButton::SetButton(..., object *ButtonObj, void (object::*ButtonFunc)()) { this->ButtonObj = ButtonObj; this->ButtonFunc = ButtonFunc; }
オブジェクトへの参照を渡します。このオブジェクトには、ButtonObj ポインターを使用してアクセスできます。次に、((ButtonObj)->*(ButtonFunc))() を使用してメンバー関数ポインターが呼び出されます。
最後に、修正された testMenu コンストラクター:
testMenu() : MenuScreen("testMenu") { x.SetButton(100, 100, ..., this, &test2); }
以上がC でメンバー関数ポインターを正しく渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。