Я пытаюсь зарегистрировать множественные функции для обратного вызова, используя std::function
, и пытаюсь их перезвонить всякий раз, когда происходит какое-либо событие.
class DemoClass
{
public:
DemoClass();
void Callback1(int x);
void Callback2(int x);
void callEventPrinter(); //Just for Demo purpose
private:
int xVar;
EventHandler *handler;
};
DemoClass::DemoClass():xVar(), handler(nullptr)
{
CallBackRegister *handler = new EventHandler();
using namespace std::placeholders;
std::shared_ptr<std::function<void(int)>> func1 = std::make_shared<std::function<void(int)>>(std::bind(&DemoClass::Callback1, this, _1));
handler->addHandler(func1, 7);
}
void DemoClass::callEventPrinter()
{
handler->printOnCallBacks();
}
void DemoClass::Callback1(int x)
{
cout << "Callback1: " << x + xVar << endl;
}
void DemoClass::Callback2(int x)
{
cout << "Callback2: " << x + xVar << endl;
}
Вот класс, в котором я пытаюсь зарегистрировать множественные обратные вызовыи сохраняя их в Map для будущего использования.
class CallBackRegister
{
public:
void addHandler(std::shared_ptr<std::function<void(int)>> callback, int id)
{
cout << "Calback Handle added..." << endl;
callBackSet[id] = std::move(callback);
}
void printOnCallBacks(){
std::shared_ptr<std::function<void(int)>> callback = callBackSet[7]; //HERE SEGMENTATION FAULT IS GENERATED
}
CallBackRegister():callBackSet(){};
private:
std::map<int, std::shared_ptr<std::function<void(int)>>>callBackSet;
};
Я генерирую ошибку сегментации в методе printOnCallBacks()
, комментарий упоминается в строке.
Предоставление main только для справки.
int main(){
DemoClass *demoClass = new DemoClass();
demoClass->callEventPrinter();
return 0;
}
Справочный вопрос: Простые примеры обратного вызова члена класса C ++