我有一点循环依赖问题。它工作正常,但它使代码看起来很难看。这是在蛇游戏的背景下。
我有一个类,Snake,它包含一个 SnakeSegments 向量,并管理它们的交互(例如作为一个单元移动和增长,而不是作为单独的实体)。
当 SnakeSegment 与 Food 对象碰撞时,它会将其 hasEaten 成员翻转为 true。Snake 会定期查询 SnakeSegments,主要是针对该成员。如果任何查询返回正值(即有一个击中食物),则 Snake 将作为一个单元增长(即扩大头部并缩小尾部)。这一切都很好,但我更喜欢基于信号的方法,当 SnakeSegment 碰到食物时,它会向 Snake 类发送警报(信号、中断等),告诉它成长. 这意味着我的 Snake 更新函数中不会有丑陋的代码来检查所有段;我会在我的 Snake 类中有一个 OnEat() 函数。
但是,这会导致循环依赖;Snake 包含一个 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 的解决方案不是我正在寻找的。