Heim >Backend-Entwicklung >C++ >Wie übergebe ich eine Mitgliedsfunktion der C-Klasse als Rückruf?

Wie übergebe ich eine Mitgliedsfunktion der C-Klasse als Rückruf?

Linda Hamilton
Linda HamiltonOriginal
2024-12-17 22:24:10544Durchsuche

How to Pass a C   Class Member Function as a Callback?

Klassenmitgliedsfunktionen als Rückrufe übergeben

Bei der objektorientierten Programmierung ist es gelegentlich erforderlich, eine Klassenmitgliedsfunktion als Rückruf an zu übergeben eine externe API. Wenn Sie dies jedoch direkt versuchen, können Kompilierungsfehler auftreten, wie im folgenden Szenario gezeigt:

m_cRedundencyManager->Init(this->RedundancyManagerCallBack);

Der Compiler beschwert sich über eine fehlende Argumentliste für den Funktionszeiger und schlägt stattdessen die Verwendung von &CLoggersInfra::RedundancyManagerCallBack vor. Allerdings schlägt die Kompilierung immer noch fehl.

Elementfunktionen verstehen

Bevor Sie sich mit der Lösung befassen, ist es wichtig, die wahre Natur der Elementfunktionen zu verstehen. In C sind Memberfunktionen im Wesentlichen reguläre Funktionen, die einen zusätzlichen versteckten Parameter besitzen: diesen. Dieser versteckte Parameter stellt die Objektinstanz dar, zu der die Funktion gehört.

Betrachten Sie das folgende Beispiel:

class A {
public:
    int data;
    void foo(int addToData) { data += addToData; }
};

Die Funktion A::foo benötigt einen Parameter, arbeitet aber intern mit zwei Parametern : addToData und dies. Letzteres zeigt auf das A-Objekt, für das foo aufgerufen wird. Dieses Verhalten ist implizit, wenn die Mitgliedsfunktionssyntax an_a_object.foo(5) verwendet wird. Syntaktisch übersetzt der Compiler dies in A::foo(&an_a_object, 5).

Das Problem mit Rückrufen

Eine Rückkehr zum ursprünglichen Problem erwartet die Init-Funktion der API ein Funktionszeiger, der einen einzelnen Parameter akzeptiert. Klassenmitgliedsfunktionen wie CLoggersInfra::RedundancyManagerCallBack erfordern jedoch grundsätzlich zwei Parameter, einschließlich des ausgeblendeten Parameters this. Diese Inkompatibilität führt zum Kompilierungsfehler.

Lösung: Bindung mit Boost- oder Lambda-Funktionen

Die herkömmliche Lösung besteht darin, die Mitgliedsfunktion mithilfe von Boosts Boost an eine bestimmte Klasseninstanz zu binden ::bind-Bibliothek oder die Lambda-Funktionen von C 11.

Mit boost::bind kann man eine neue Funktion erstellen, die die erforderlichen Parameter übernimmt durch „Sperren“ des ausgeblendeten Parameters an eine bestimmte Objektinstanz. Diese neue Funktion kann dann als Callback übergeben werden.

#include <boost/bind.hpp>
auto bound_callback = boost::bind(&CLoggersInfra::RedundencyManagerCallBack, this);
Init(boost::function<void()>(bound_callback));

C 11 bietet Lambda-Funktionen als einfachere Alternative zu boost::bind. Lambda-Funktionen können auch diesen Zeiger erfassen und so eine präzise Rückrufbindung ermöglichen:

auto lambda_callback = [this]() { RedundancyManagerCallBack(); };
Init(std::function<void()>(lambda_callback));

Das obige ist der detaillierte Inhalt vonWie übergebe ich eine Mitgliedsfunktion der C-Klasse als Rückruf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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