Почему не работает (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 << "ConcreteHandler1" << std::endl;
Handler::HandleRequest(data);
}
};
class ConcreteHandler2 : public Handler {
public:
void HandleRequest(int data) {
//if can handle it do it
//implementation of HadleRequest
//else
std::cout << "ConcreteHandler2" <SetNextHandler(new ConcreteHandler1());
handler->SetNextHandler(new ConcreteHandler2());
handler->HandleRequest(data);
return 0;
}

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

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

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

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

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

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

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

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