gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:59:54 26 4
gpt4 key购买 nike

我正在用 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;
}
}

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

class Weapon{
friend class Creature; // Creature needs access to creature_ pointer
private:
creature_;
}

如您所见,我已将 Creature 设为 Weapon 的友元类,以便 Creature 的 setWeapon() 方法可以适本地设置私有(private) creature_ 指针。

我的具体问题:

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

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

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

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

最佳答案

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

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;
};

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

关于c++ - 需要相互引用的两个对象。馊主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35424823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com