Die ursprüngliche Frage, die darauf abzielte, einen generischen Ereignishandling-Mechanismus zu erstellen, der konsequent über verschiedene Klassen hinweg funktioniert. Anstatt sich auf statische Methoden zu verlassen und Klasseninstanzzeiger umzugeben, kann ein modernerer C -Ansatz mit std :: function und std :: bind verwendet werden.
Die Ereignishandlerklasse akzeptiert jetzt eine STD :: Funktionsobjekt als Argument. Ein Funktionsobjekt repräsentiert eine aufrufbare Entität, die wie ein regulärer Funktionszeiger weitergegeben werden kann. Die Ereignishandler -Methode addHandler nimmt eine std :: function Klasse Myclass
{
öffentlich:
Myclass ();
// Hinweis: Nicht mehr mit "statisch" gekennzeichnet und nur das tatsächliche Argument nimmt
void Callback (int x);
Privat:
int private_x;
};
Myclass :: MyClass ()
{
Verwenden von Namespace STD :: Platzhalter; // für `_1`
private_x = 5;
Handler-> addHandler (std :: bind (& myclass :: callback, this, _1));
}
void myclass :: callback (int x)
{
// braucht kein explizites "Instanz" Argument mehr,
// als "das" ist richtig eingerichtet
cout void freestingcallback (int x)
{
// ...
}
int main ()
{
// ...
Handler-> addHandler (freistehende Callback);
} class EventHandler
{
public:
void addHandler(std::function
, um eine bestimmte Klassenmethode an den Ereignishandler zu binden, wird std :: bind verwendet. Std :: Bind gibt den Zeiger und die Funktion an, die aufgerufen werden muss, wenn das Ereignis ausgelöst wird.
class MyClass
{
public:
MyClass();
// Note: No longer marked `static`, and only takes the actual argument
void Callback(int x);
private:
int private_x;
};
MyClass::MyClass()
{
using namespace std::placeholders; // for `_1`
private_x = 5;
handler->addHandler(std::bind(&MyClass::Callback, this, _1));
}
void MyClass::Callback(int x)
{
// No longer needs an explicit `instance` argument,
// as `this` is set up properly
cout
Wenn der Rückruf eine freistehende Funktion ohne Klassenkontext ist, ist std :: bind nicht erforderlich.
void freeStandingCallback(int x)
{
// ...
}
int main()
{
// ...
handler->addHandler(freeStandingCallback);
}
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3