两个需要互相引用的对象。馊主意?

MeL*_*ode 5 c++ dependencies friend

我正在用 C++ 开发一个非常小且简单的游戏引擎。我有一个生物类和一个武器类。该生物需要知道它拥有什么武器,并且每种武器都需要知道拥有它的生物。我希望武器知道生物拥有什么的主要原因是防止它摧毁自己的生物(当武器攻击时,会检测到与其碰撞的所有生物并杀死它们,除了拥有武器的生物)。

这是(简化的)Creature 类的样子:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(简化的)Weapon 类如下所示:

class Weapon{
    friend class Creature; // Creature needs access to creature_ pointer
    private:
    creature_;
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我将Creature设为Weapon的友元类,以便Creature的setWeapon()方法可以适当地设置私有的creature_指针。

我的具体问题:

  1. 我听说两个对象互相引用是糟糕的设计。但就我而言,我该如何不这样做呢?我真的“觉得”每个生物都应该知道它拥有什么武器,并且每个武器都应该知道它拥有什么生物(这样就不会伤害该生物)。有没有什么方法可以实现我想要的而不让这两个类相互引用?我在游戏引擎中的地图/实体、库存/物品等中一次又一次地遇到了同样的问题...似乎每当我有一个“Container”类和一个“Item”类时,这个引用问题就会再次出现。我想将添加项目的责任仅放在其中一个类中,但我希望两个类彼此了解(即我希望生物知道其武器,武器了解其生物)。有没有办法在不让两个项目相互引用的情况下实现这一目标?

  2. 这种设计有时是必要的吗?或者是否有一种通用方法可以始终避免它并实现相同类型的功能?

  3. 如果这种设计确实需要实现此类功能,那么使用友元类是处理它的正确方法吗?

预先非常感谢您。我非常有兴趣了解是否有一种方法可以在不让对象相互引用的情况下实现此类功能。

Ale*_*nov 2

此类问题时有发生,可通过以下技术解决:

class Creature {
public:
    void SetWeapon(Weapon* w) {
        weapon_ = w;
        weapon_->SetCreature(this);
    }
private:
    Weapon* weapon_;
};

class Weapon {
public:
    void SetCreature(Creature* _creature) {
        m_owner = _creature;
    }
private:
    Creature* m_owner;
};
Run Code Online (Sandbox Code Playgroud)

至于你的广泛问题 - 如果你在同一个项目中经常遇到此类问题,我建议你重新考虑你的设计解决方案。
例如,你关于武器来了解其生物的主张是违反直觉的,而且感觉不对。因此,从这个假设开始,我相信您最终会得到更好的设计,您的武器不会了解其所有者的任何信息(就像在现实生活中一样!)。