首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >两个需要相互引用的对象。馊主意?

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

Stack Overflow用户
提问于 2016-02-16 05:55:00
回答 3查看 2.8K关注 0票数 4

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

以下是(简化的)生物类的样子:

代码语言:javascript
运行
复制
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;
    }
}

以下是(简化的)武器类的样子:

代码语言:javascript
运行
复制
class Weapon{
    friend class Creature; // Creature needs access to creature_ pointer
    private:
    creature_;
}

正如您所看到的,我已经使生物成为一个朋友类的武器,以便setWeapon()方法的生物可以适当地设置私有creature_指针。

我的具体问题:

  1. 我听说两个相互引用的对象是糟糕的设计。但就我而言,我怎么才能不这么做呢?我真的“感觉”每一个生物都应该知道它拥有什么武器,每个武器都应该知道什么生物拥有它(这样它就不会伤害那个生物)。有什么办法可以达到我想要的,而不让这两个类互相引用?在地图/实体、库存/物品的游戏引擎中,我一次又一次地遇到了同样的问题,每当我有“容器”类和“项”类时,这个引用问题就会再次出现。我只想把这个项目添加到其中一个类中,但我希望两个类都知道对方的情况(也就是说,我希望生物知道它的武器,而武器知道它的生物)。有没有办法做到这一点,而不让两个项目相互引用?
  2. 这个设计有时是必要的吗?还是有一种通用的方法来避免它,同时实现相同类型的功能?
  3. 如果这个设计真的是实现这种功能所必需的,那么使用一个朋友类是否是正确的处理方法呢?

提前谢谢你。我非常有兴趣了解是否有一种方法可以实现这类功能,而不需要对象之间的相互引用。

EN

回答 3

Stack Overflow用户

发布于 2016-02-16 06:04:55

这类问题时有发生,并通过以下技术得到解决:

代码语言:javascript
运行
复制
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;
};

至于你的广泛问题--如果你经常在同一个项目中遇到这样的问题,我建议你重新考虑你的设计解决方案。

例如,你关于武器的主张是违反直觉的,而且感觉不对。所以,从这个假设开始,我相信你最终会得到更好的设计,在那里你的武器不会了解他们的主人(就像在现实生活中一样)。

票数 1
EN

Stack Overflow用户

发布于 2016-02-16 06:07:22

  1. 你听得对。以这种方式使用引用对象并不是一个好的编程实践,但是使用goto也被一些人认为是一种糟糕的方法。有关其他解决方案,请参阅下文。
  2. 这个设计可以被使用,因为有时我们需要goto循环。BUt不喜欢很多人使用的方法。

替代解决方案:根据您的需要,我可以提出另一种方法,希望这会有所帮助。您可以创建struct来容纳播放器对象和武器对象,而不是在各自的类中相互引用。这样,它将更容易操纵和作出改变,根据自己的愿望。也就是说,玩家可以拥有许多武器(在本例中,您可以在struct中创建数组)。每个玩家都会有一个武器的实例。

票数 0
EN

Stack Overflow用户

发布于 2016-02-16 09:35:42

让对象来回引用是非常常见的。一个常见的例子是返回父级的指针。你的想法是完全合理的。只需确保您的析构函数已就位,以便清除对象指针。

~Weapon()中,清除Creature指向武器的指针,反之亦然。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35424823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档