我正在开发一个非常小而简单的C++游戏引擎。我有一个生物类和一个武器类。生物需要知道它有什么武器,每个武器需要知道拥有它的生物。我希望武器知道生物具有何种功能的主要原因是为了防止它破坏它自己的生物(当武器攻击时,它将检测它碰撞并杀死它们的所有生物,除了拥有武器的生物)。两个需要相互引用的对象。馊主意?
这里是(简化)生物类的样子:
class Creature {
private:
Weapon* weapon_;
public:
void SetWeapon(Weapon* w){
// do some other stuff (e.g. remove Weapon from any other Creatures)
weapon_ = w;
w->creature_ = this;
}
}
这里是(简化)的武器类的样子:
class Weapon{
friend class Creature; // Creature needs access to creature_ pointer
private:
creature_;
}
正如你所看到的,我已经生物武器的朋友类,以便Creature的setWeapon()方法可以适当地设置私人生物_指针。
我的具体问题:
我听说两个对象引用对方是糟糕的设计。但就我而言,我怎么会不这样做呢?我真的“感觉到”每个生物都应该知道它有什么武器,每个武器都应该知道生物具有什么(以便它不会伤害生物)。有没有什么方法可以实现我想要的,而不需要让这两个类互相引用?我在Map/Entity,Inventory/Item等游戏引擎中一次又一次地遇到了这个SAME问题。似乎每当我有一个“Container”类和一个“Item”类时,这个引用问题就会重新出现。我想把这个项目加入到其中一个类中,但我希望两个类彼此知道(即我想让生物知道它的武器和武器知道它的生物)。没有任何方法可以实现这一点,而不需要两个项目相互引用?
这种设计有时是必需的吗?还是有一种通用的方式来总是避免它,但实现相同类型的功能?
如果这种设计对于实现这种功能来说确实是必要的,那么使用朋友类是否有正确的方法来处理它?
非常感谢你提前。我非常有兴趣学习如果有一种方法可以实现这种类型的功能,而不需要对象彼此引用。
你有没有考虑让这个生物进攻而不是武器?然后,你可以拥有攻击()方法,因为该生物拥有武器并且该生物知道自己,所以该武器和生物都知道。 – Knox
@Knox我的确在想这个,但是我希望攻击行为在于武器而不是生物。当一个生物被告知攻击()时,它应该简单地委托给weapon_.attack()。这将允许生物动态交换武器。 – MeLikeyCode
然后或许让生物的attack()方法调用武器的_attack(实体),这样你可以为武器范围内的每个实体(不包括它本身)调用_attack()。 – Knox