Heim >Backend-Entwicklung >C++ >Können Memberfunktionen der C-Klasse als C-Callbacks verwendet werden?

Können Memberfunktionen der C-Klasse als C-Callbacks verwendet werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-15 07:36:14610Durchsuche

Can C   Class Member Functions Be Used as C Callbacks?

Verwenden einer C-Klasse-Member-Funktion als C-Callback-Funktion

Problem:

Wann Beim Versuch, eine Mitgliedsfunktion der C-Klasse als Rückruffunktion für eine C-Bibliothek zu registrieren, gibt der Compiler einen Fehler aus, der darauf hinweist, dass der Typ der Funktion nicht mit der Funktion übereinstimmt erwartete Signatur.

Fragen:

  1. Ist es möglich, eine Mitgliedsfunktion der C-Klasse als Callback-Funktion zu registrieren?
  2. Gibt es Alternativen Lösungsansätze hierfür Problem?

Antwort:

1. Verwenden einer statischen Mitgliedsfunktion:

Ja, es ist möglich, eine Mitgliedsfunktion der C-Klasse als Rückruffunktion zu registrieren, es muss jedoch eine statische Mitgliedsfunktion sein. Statische Memberfunktionen verfügen nicht über einen impliziten ersten Parameter vom Typ Klasse A*, sodass ihre Signatur mit der erwarteten Rückrufsignatur übereinstimmt. Zum Beispiel:

class A {
public:
    static int e(int *k, int *j) {
        return 0;
    }
};

int main() {
    register_with_library(A::e);
    return 0;
}

2. Alternative Ansätze:

Alternativ können Sie einen der folgenden Ansätze verwenden:

  • Eine freie Funktion erstellen:Eine freie Funktion mit dem entsprechenden erstellen Signatur und rufen Sie die Mitgliedsfunktion der C-Klasse darin auf. Zum Beispiel:
void e_wrapper(int *k, int *j) {
    A().e(k, j);
}
  • Verwenden Sie einen Funktionszeiger: Definieren Sie einen Funktionszeiger und weisen Sie ihm die Adresse der C-Klassenmitgliedsfunktion zu. Zum Beispiel:
int (*ptr)(int *, int *) = &A::e;
register_with_library(ptr);

Das obige ist der detaillierte Inhalt vonKönnen Memberfunktionen der C-Klasse als C-Callbacks verwendet werden?. 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