Почему не работает (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;
}

21 Авг 2019 в 06:57
149 +1
0
Ответы
1

Проблема в вашем коде заключается в том, что вы рекурсивно вызываете функцию SetNextHandler изнутри самой себя, что может привести к бесконечному зацикливанию и переполнению стека вызовов.

Вместо этого вам нужно изменить ваш метод SetNextHandler, чтобы он правильно устанавливал следующий обработчик. Например, вы можете добавить новые обработчики в конец цепочки, а не зацикливать их.

Исправленный код должен выглядеть примерно так:

void SetNextHandler(Handler* next_handler) {
if (next) {
next->SetNextHandler(next_handler);
} else {
next = next_handler;
}
}

Таким образом, вы правильно устанавливаете следующий обработчик в конец цепочки обязанностей, избегая рекурсивных вызовов и проблем с потоками.

Помимо этого, не забудьте добавить деструкторы для освобождения памяти выделенной под обработчики.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир