ホームページ >バックエンド開発 >C++ >C でメンバー関数ポインターを正しく渡すにはどうすればよいですか?

C でメンバー関数ポインターを正しく渡すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-05 08:52:10281ブラウズ

How Can I Correctly Pass Member Function Pointers in C  ?

C でのメンバー関数ポインターの受け渡し

オブジェクト指向プログラミングでは、多くの場合、メンバー関数を引数として別の関数に渡すことが必要になります。ただし、これを正しく実行するのは、特に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。