Übergabe von Klassenmitgliedsfunktionen als Rückrufe
Bei der Verwendung einer API, die einen Funktionszeiger als Rückruf erfordert, können beim Übergabeversuch Schwierigkeiten auftreten eine Klassenmitgliedsfunktion innerhalb der Klasse selbst. Dieser Artikel untersucht die Feinheiten dieses Problems und bietet Lösungen, um es effektiv zu lösen.
Problemstellung
Stellen Sie sich eine hypothetische Klasse, CLoggersInfra, vor, die eine Mitgliedsfunktion, RedundancyManagerCallBack, enthält . Sie möchten diese Mitgliedsfunktion als Rückruf innerhalb einer anderen API-Funktion Init verwenden, stoßen jedoch auf den folgenden Kompilierungsfehler:
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
Delving into the Issue
The Der Fehler ergibt sich aus einem grundlegenden Merkmal von Mitgliedsfunktionen in C. Während sie scheinbar ausschließlich zu einer bestimmten Klasseninstanz gehören, erhalten sie von Natur aus einen zusätzlichen versteckten Parameter, der einen Verweis auf die Klasseninstanz selbst darstellt. Dies wird allgemein als „dieser“ Zeiger bezeichnet.
Erklärte Lösungen
1. Mit Boost
Boost, eine Bibliothek eines Drittanbieters, bietet ein leistungsstarkes Tool zur Lösung dieses Problems: boost::bind. Damit können Sie eine neue Funktion erstellen, die einen bestimmten Parameter „sperrt“. In diesem Fall kann der versteckte „this“-Parameter an eine bestimmte Klasseninstanz gebunden werden, wodurch effektiv eine neue Funktion mit nur einem sichtbaren Parameter erstellt wird.
2. Umschließen mit einem benutzerdefinierten Objekt
Alternativ können Sie ein benutzerdefiniertes Objekt erstellen, das einen Verweis auf die Klasseninstanz akzeptiert und eine „run“- oder „execute“-Methode bereitstellt, die die Mitgliedsfunktion mit den bereitgestellten Parametern aufruft . Dieser Ansatz erfordert jedoch eine Änderung der API, um Ihr benutzerdefiniertes Objekt anstelle eines rohen Funktionszeigers zu akzeptieren.
3. C 11 Lambda-Funktionen
In C 11 und höher bieten Lambda-Funktionen eine elegantere Lösung. Sie können den „this“-Zeiger erfassen, sodass kein separates benutzerdefiniertes Objekt erforderlich ist. Lambda-Funktionen bieten eine prägnante und bequeme Möglichkeit, die gewünschte Funktionalität zu erreichen.
Fazit
Das Verständnis der inhärenten Natur von Mitgliedsfunktionen und ihres versteckten „dieses“ Parameters ist entscheidend für erfolgreich als Rückrufe übergeben. Durch die Nutzung der Funktionen von boost::bind oder C 11-Lambda-Funktionen können Sie Kompilierungsfehler effektiv beheben und Klassenmitgliedsfunktionen reibungslos als Rückruffunktionen nutzen.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Mitgliedsfunktion der C-Klasse als Rückruf übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!