Wie weise ich Referenzen von nicht statischen Memberfunktionen mit identischen Signaturen, aber aus verschiedenen Klassen, einem Funktionszeiger mit einer passenden Signatur zu?C++ Zeiger auf eine Memberfunktion einer Klasse mit übereinstimmenden Funktionssignaturen
Ich kann dies mit Hilfe von std::function
aus der C++ - Standardbibliothek tun. Ich mache das auch die ganze Zeit mit regulären C-Funktionen und ohne Hilfe von der Std-Bibliothek. Ich schreibe Firmware und Coderaum ist begrenzt. Wenn Helfer aus der C++ - Standardbibliothek dies tun können, muss es sicherlich möglich sein, dies manuell unter Verwendung von rein C/C++ - Sprachkonstrukten zu tun (vor C++ 11 bevorzugt).
Beispielcode meine Absicht demonstriert:
class A {
public:
void ping_event_handler();
};
class B {
public:
void ping_event_handler();
};
void A::ping_event_handler_A() {
// Handle ping event in A...
}
void B::ping_event_handler_B() {
// Handle ping event in B...
}
void ping_event_handler_C() {
// Handle ping event in normal function...
}
int main() {
// Ping event "pointer to a function that takes no arguments"
void (*ping_event)();
A a();
B b();
ping_event = a.ping_event_handler; // Attach class A's handler
ping_event(); // Trigger event
ping_event = b.ping_event_handler; // Attach class B's handler
ping_event(); // Trigger event
ping_event = ping_event_handler; // Attach non-class handler
ping_event(); // Trigger event
}
Für einen Start 'A a () "ist falsch. Dies deklariert eine Funktion 'a' –
' ping_event = a.ping_event_handler; '- Woher weiß der Compiler, welchen Wert er 'this' geben soll? –
Entweder deklarieren Sie diese Methoden als statisch (wenn sie den Status des Objekts nicht benötigen) oder virtuell (geerbt von einer gemeinsamen Basisklasse) und ersetzen den Zeiger auf eine Funktion durch einen Zeiger auf eine Basisklasse. Wenn Sie Zeiger auf Funktionen und Zeiger auf Methoden mischen wollen, dann benötigen Sie einen Wrapper als std: function. – avsmal