Heim > Backend-Entwicklung > C++ > Wie kann ich Mitgliedsfunktionszeiger in C korrekt übergeben?

Wie kann ich Mitgliedsfunktionszeiger in C korrekt übergeben?

Mary-Kate Olsen
Freigeben: 2024-12-05 08:52:10
Original
266 Leute haben es durchsucht

How Can I Correctly Pass Member Function Pointers in C  ?

Übergabe von Member-Funktionszeigern in C

Bei der objektorientierten Programmierung ist es oft notwendig, eine Member-Funktion als Argument an eine andere Funktion zu übergeben. Allerdings kann es etwas schwierig sein, dies richtig zu machen, insbesondere wenn der Zeiger this verwendet wird.

Betrachten wir ein konkretes Beispiel aus dem bereitgestellten Codeausschnitt:

class testMenu : public MenuScreen {
  // ...
  void test2() {
    draw = true;
  }
};

MenuButton<testMenu> x;

testMenu() : MenuScreen("testMenu") {
  x.SetButton(100, 100, ..., &test2);
}
Nach dem Login kopieren

Hier die Memberfunktion test2 wird dem ButtonFunc-Mitglied des MenuButton mithilfe der SetButton-Funktion zugewiesen:

template <class object>
void MenuButton::SetButton(..., void (object::*ButtonFunc)()) {
  this->ButtonFunc = &ButtonFunc;
}
Nach dem Login kopieren

Das Problem tritt beim Aufruf der test2-Funktion auf aus der MenuButton-Klasse. Dazu benötigen wir sowohl einen Zeiger auf das Objekt (also testMenu) als auch einen Zeiger auf die Funktion (also &test2). In der modifizierten Version von SetButton:

template <class object>
void MenuButton::SetButton(..., object *ButtonObj, void (object::*ButtonFunc)()) {
  this->ButtonObj = ButtonObj;
  this->ButtonFunc = ButtonFunc;
}
Nach dem Login kopieren

Wir übergeben einen Verweis auf das Objekt, auf das mit dem ButtonObj-Zeiger zugegriffen werden kann. Der Mitgliedsfunktionszeiger wird dann mit ((ButtonObj)->*(ButtonFunc))() aufgerufen.

Schließlich der korrigierte testMenu-Konstruktor:

testMenu() : MenuScreen("testMenu") {
  x.SetButton(100, 100, ..., this, &test2);
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich Mitgliedsfunktionszeiger in C korrekt übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage