исходный вопрос, направленный на создание общего механизма обработки событий, который будет работать последовательно в разных классах. Вместо того, чтобы полагаться на статические методы и передавать указатели экземпляра класса, более современный C -подход можно использовать с использованием std :: function и std :: bind.
класс обработчика событий теперь принимает объект fund :: функция как аргумент. Функциональный объект представляет собой вызываемая сущность, которая может быть передана как регулярная указатель функции. Метод обработчика событий addHandler принимает функцию std :: function класс MyClass
{
публика:
Myclass ();
// Примечание: больше не отмечается «static» и только принимает фактический аргумент
void обратный вызов (int x);
частный:
int private_x;
};
Myclass :: myclass ()
{
Использование пространства имен Std :: Placeholders; // для `_1`
private_x = 5;
Handler-> addHandler (std :: bind (& myclass :: обратный вызов, это, _1));
}
void myclass :: обратный вызов (int x)
{
// больше не нуждается в явном аргументе `encess`,
// как `this` настроен правильно
cout void freestandingCallback (int x)
{
// ...
}
int main ()
{
// ...
Handler-> addhandler (FreestingCallback);
} Handler-> addHandler ([] (int x) {std :: cout ]class EventHandler
{
public:
void addHandler(std::function
для привязки конкретного метода класса с обработчиком событий, std :: bind используется. std :: bind Указывает этот указатель и функцию, которую можно вызвать при запуска событий.
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
, если обратный вызов-это свободная функция без контекста класса, std :: bind не требуется.
void freeStandingCallback(int x)
{
// ...
}
int main()
{
// ...
handler->addHandler(freeStandingCallback);
}
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3