Ü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));
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!