У меня небольшая проблема с круговой зависимостью.Это работает хорошо, но это делает для уродливого кода.Это в контексте игры Snake.
У меня есть класс Snake, который содержит вектор SnakeSegments и управляет их взаимодействием (например, перемещаясь и растя как единое целое, а не как отдельные сущности).
Когда SnakeSegment сталкивается с объектом Food, он переворачивает свой член hasEaten в true.Snake обычно запрашивает SnakeSegments, по существу, для этого члена.Если какой-либо из запросов даст положительный результат (т. Е. Один из них попал в еду), то Змея будет расти как единое целое (т. Е. Расширять голову и уменьшать хвост).Это все хорошо и хорошо, но я бы предпочел более основанный на сигналах подход, где, когда SnakeSegment попадает в еду, он отправляет предупреждение (сигнал, прерывание и т. Д.) Классу Snake, который говорит ему расти,Это означает, что у меня не будет неприятного кода в функции обновления моего Снейка, проверяющей все сегменты;и вместо этого у меня в классе Snake была бы функция OnEat ().
Однако это приводит к циклическим зависимостям;Змея содержит вектор SnakeSegments, а у SnakeSegments есть член Snake & или Snake *, который сообщает им, кого следует предупреждать, когда они едят.В коде мне просто нужно предварительно объявить класс Snake:
class Snake;
class SnakeSegment
{
...
Snake* alertOnEat;
...
};
, и мой класс Snake просто работает нормально
#include "SnakeSegment.hpp"
class Snake
{
...
std::vector segments;
...
void OnEat();
...
};
Есть ли более приятные варианты для этого?Обратите внимание, что это не просто проблема, возникающая здесь;аналогичная проблема возникает в ряде областей (например, GameWorld содержит члена Snake, и Snake предупреждает GameWorld, когда он умирает), поэтому решение, специфичное для Snake и SnakeSegment, не то, что я ищу.