Регистрация множественного обратного вызова вызывает ошибку сегментации в C ++, - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь зарегистрировать множественные функции для обратного вызова, используя 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 ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...