Heim > Backend-Entwicklung > C++ > Wie übergebe ich Klassenmitgliedsfunktionen korrekt als Rückrufe in C?

Wie übergebe ich Klassenmitgliedsfunktionen korrekt als Rückrufe in C?

Linda Hamilton
Freigeben: 2024-12-16 13:26:21
Original
534 Leute haben es durchsucht

How to Correctly Pass Class Member Functions as Callbacks in C  ?

Überwindung von Kompilierungsfehlern beim Übergeben von Klassenmitgliedsfunktionen als Rückrufe

Bei der Übergabe einer Klassenmitgliedsfunktion als Rückruf treten aufgrund von Missverständnissen Kompilierungsfehler auf über die Syntax und den versteckten „this“-Parameter in Memberfunktionen.

Klärendes Mitglied Funktionen

Mitgliedsfunktionen sind keine eigenständigen Funktionen, sondern Funktionen mit einem zusätzlichen versteckten „this“-Zeiger. Dieser Zeiger verweist auf die Instanz der Klasse, zu der die Funktion gehört. Beim Aufrufen einer Mitgliedsfunktion mithilfe der Klasseninstanzsyntax (z. B. object.memberFunction()) ermittelt der Compiler automatisch den Wert von „this“.

Syntax-Rätsel

Ihr erster Ansatz ist fehlgeschlagen, weil Sie versucht haben, &CLoggersInfra::RedundencyManagerCallBack als Rückruf zu übergeben. Diesem Funktionszeiger fehlt der notwendige „this“-Zeiger. Die korrekte Syntax lautet:

m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));
Nach dem Login kopieren

Das Verborgene „dies“ enthüllen

Sie möchten einen Rückruf übergeben, der sich speziell auf eine bestimmte Instanz der CLoggersInfra-Klasse bezieht. Um den versteckten „this“-Zeiger zu berücksichtigen, müssen Sie ihn explizit binden.

std::bind1st und boost::bind Rescue

Verwenden Sie std::bind1st oder boost::bind, um den „this“-Zeiger zu binden und so eine neue Funktion zu erstellen, die die Instanz als versteckten Parameter und die ursprünglichen Parameter des Callbacks wie gewohnt verwendet. Dadurch wird das Kompilierungsproblem behoben.

Der versteckte Haken

Init erfordert einen rohen Funktionszeiger, den boost::bind nicht standardmäßig bereitstellt. StackOverflow bietet jedoch eine Lösung zum Konvertieren von boost::functions in Rohzeiger.

C 11-Update mit Lambda-Funktionen

In C 11 und höher werden Lambda-Funktionen erfasst „this“ kann zu diesem Zweck boost::bind ersetzen.

Das obige ist der detaillierte Inhalt vonWie übergebe ich Klassenmitgliedsfunktionen korrekt als Rückrufe in C?. 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