Почему не работает (Chain of Responsibilty)? Ку Реализовал паттерн цепочка обязанностей, но при тестировании выскакивает проблема с потоками, кто знает, как с этим разобраться? (Проблема помечена в коде, тесты, на которых выявилась проблема в мэйне)class Handler { public: Handler(): next(nullptr) {}; virtual ~Handler() {}; virtual void HandleRequest(int data) { if (next) { this->next->HandleRequest(data); } } void SetNextHandler(Handler* next_handler) { //Здесь вроде проблема if (next) { this->SetNextHandler(next_handler); } else { this->next = next_handler; } } public: Handler* next; }; class ConcreteHandler1 : public Handler { public: void HandleRequest(int data) { //if can handle it do it //implementation of HadleRequest //else std::cout SetNextHandler(new ConcreteHandler1()); handler->SetNextHandler(new ConcreteHandler2()); handler->HandleRequest(data); return 0; }
Проблема в вашем коде заключается в том, что вы рекурсивно вызываете функцию SetNextHandler изнутри самой себя, что может привести к бесконечному зацикливанию и переполнению стека вызовов.
Вместо этого вам нужно изменить ваш метод SetNextHandler, чтобы он правильно устанавливал следующий обработчик. Например, вы можете добавить новые обработчики в конец цепочки, а не зацикливать их.
Исправленный код должен выглядеть примерно так:
void SetNextHandler(Handler* next_handler) { if (next) { next->SetNextHandler(next_handler); } else { next = next_handler; } }
Таким образом, вы правильно устанавливаете следующий обработчик в конец цепочки обязанностей, избегая рекурсивных вызовов и проблем с потоками.
Помимо этого, не забудьте добавить деструкторы для освобождения памяти выделенной под обработчики.
Проблема в вашем коде заключается в том, что вы рекурсивно вызываете функцию SetNextHandler изнутри самой себя, что может привести к бесконечному зацикливанию и переполнению стека вызовов.
Вместо этого вам нужно изменить ваш метод SetNextHandler, чтобы он правильно устанавливал следующий обработчик. Например, вы можете добавить новые обработчики в конец цепочки, а не зацикливать их.
Исправленный код должен выглядеть примерно так:
void SetNextHandler(Handler* next_handler) {if (next) {
next->SetNextHandler(next_handler);
} else {
next = next_handler;
}
}
Таким образом, вы правильно устанавливаете следующий обработчик в конец цепочки обязанностей, избегая рекурсивных вызовов и проблем с потоками.
Помимо этого, не забудьте добавить деструкторы для освобождения памяти выделенной под обработчики.