微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在 C++ 中编写两个类,其中每个类都需要知道另一个存在?

如何解决是否可以在 C++ 中编写两个类,其中每个类都需要知道另一个存在?

这类似于这些问题: Is it possible to initialise two classes,that require pointers to each other,at the same time?

Two classes that refer to each other

但我正在寻找更通用或“最佳实践”的解决方案。

这是游戏设计中经常出现的一个问题:当许多对象需要来自其他对象的信息时,其中一个将不可避免地比任何其他元素“最下游”(就标题包含而言)。鉴于有成千上万的游戏,我假设有一些“好的”解决方案。

特别是,我有一个虚拟基类“GameObject”,我的所有游戏对象都属于它:玩家、子弹、僵尸……以及存储所有游戏对象的“GameObject*”映射。我的 GameState 类保存了这张地图,所有的 Game 对象都保留了指向地图的相同静态指针。每个游戏对象还有一个称为“碰撞”的向量,它保存了自上次更新以来与它发生碰撞的每个游戏对象的 ptr。

Class GameObject {
    private:
    static int objID;
    int id;

    //maps
    static std::unordered_map<int,GameObj*>* objs;

    public:
    //list of collisions with other objects
    std::vector<GameObj*> collisions;


//Accessors - some generic accessors
unsigned int getID() const;
ObjType getType() const;
sf::Vector2f getPos() const;
virtual const sf::FloatRect& getGlobalBounds() const = 0;

//And the key function,update
virtual STATE update() = 0;

}

我的 GameState 类包含一个方法,该方法调用 Player::update()(对于所有玩家,它是一个非静态方法),为所有僵尸调用 Zombies::update() 等等。 Update() 是 GameObject 的纯虚函数

如果 Player.h 包含 Zombie.h,那么我可以进入我的播放器类,遍历我的子弹向量并检查它们中是否有任何一个与僵尸相撞。我可以根据需要删除项目符号、添加到玩家分数等。

但是,在我的 Zombie 课程中,我可以推断出僵尸与一颗子弹相撞,但我无法推断出这颗子弹造成了多少伤害,或者其他任何关于子弹,因为僵尸不知道子弹是什么(即,我不能动态投射 GameObj* 到 Bullet* 并使用访问器方法)。那么我们如何解决这个问题。

解决方案:

  • 我想到一个原始的修复方法可能是在僵尸和玩家中都包含“Bullet.h”——这可能有效但不能解决更大的问题——说玩家对僵尸造成了直接伤害,例如。

  • 类的“前向声明”在这里对我不起作用。编译器仍然对从 GameObject* 到 Bullet* 的动态转换感到愤怒

  • 通过(通过包装器 gameState 类)传递所有子弹/僵尸信息是可能的,但很麻烦,更不用说我为所有游戏对象使用纯虚函数,其中大部分不会使用此信息正在传递。

  • 我可以扩展我的 GameObject 类以保存有关 GameObject 的更多信息,例如其损坏情况。但是,对于某些游戏对象,这些信息是无关紧要的。

  • 最后,我可以在 Player 类中对僵尸做我需要做的一切(通过动态转换),但这感觉不相干,为什么玩家要直接修改僵尸?

还有其他聪明的解决方案吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。