我正在开发一个非常小和简单的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_;
}正如您所看到的,我已经使生物成为一个朋友类的武器,以便setWeapon()方法的生物可以适当地设置私有creature_指针。
我的具体问题:
提前谢谢你。我非常有兴趣了解是否有一种方法可以实现这类功能,而不需要对象之间的相互引用。
发布于 2016-02-16 06:04:55
这类问题时有发生,并通过以下技术得到解决:
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;
};至于你的广泛问题--如果你经常在同一个项目中遇到这样的问题,我建议你重新考虑你的设计解决方案。
例如,你关于武器的主张是违反直觉的,而且感觉不对。所以,从这个假设开始,我相信你最终会得到更好的设计,在那里你的武器不会了解他们的主人(就像在现实生活中一样)。
发布于 2016-02-16 06:07:22
goto也被一些人认为是一种糟糕的方法。有关其他解决方案,请参阅下文。goto循环。BUt不喜欢很多人使用的方法。替代解决方案:根据您的需要,我可以提出另一种方法,希望这会有所帮助。您可以创建struct来容纳播放器对象和武器对象,而不是在各自的类中相互引用。这样,它将更容易操纵和作出改变,根据自己的愿望。也就是说,玩家可以拥有许多武器(在本例中,您可以在struct中创建数组)。每个玩家都会有一个武器的实例。
发布于 2016-02-16 09:35:42
让对象来回引用是非常常见的。一个常见的例子是返回父级的指针。你的想法是完全合理的。只需确保您的析构函数已就位,以便清除对象指针。
在~Weapon()中,清除Creature指向武器的指针,反之亦然。
https://stackoverflow.com/questions/35424823
复制相似问题