gpt4 book ai didi

c++ - 如果某些类继承了抽象基类,则确定何时在某些类上使用函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:21 26 4
gpt4 key购买 nike

假设我有一个基类 Object 和一个抽象基类 Collidable。 (Object 包含位置信息等,Collidable 包含 virtual void Collide(Object object) = 0。然后会有子类继承 Object,但只有某些类也会继承 Collidable。所以我的问题是,如果其中一个可碰撞的子类要检查 Object 的列表> 继承的类,它如何确定它们是否也继承 Collidable 以便它们相互碰撞而不是与不可碰撞的对象发生碰撞?

(为了更直观地看待我的问题)

class Object
{
protected:
Position myPosition;

public:
Object(void);
~Object(void);
}

class Collidable
{
protected:
/* ... */

public:
virtual void Collide(Object& object) = 0;

Collidable(void);
~Collidable(void);
}

class Grass : public Object
{
private:
/* ... */

public:

Grass(void);
~Grass(void);
}

class Wall : public Object, public Collidable
{
private:
/* ... */

public:
virtual void Collide(Object& object) { /* Collide logic */ }

Wall(void);
~Wall(void);
}

class Monster : public Object, public Collidable
{
private:
/* ... */

public:
virtual void Collide(Object& object) { /* Collide logic */ }

Monster(void);
~Monster(void);
}

int main()
{
Monster creature;
Object* objects[] = { /* list of Grass, Wall, and Monster classes */ };

for(int i = 0, i < objects.size(); i++)
{
//Logical error: not every object is collidable
creature.Collide(&objects[i]);
}
}

所以在这里,我有一个 Wall MonsterGrass 类的列表,但是 Grass 是不可碰撞的,但是,假设它需要与其他类一起留在数组中。我如何确定数组中的类是否是 Collidable

(如果我在这里不知何故偏离重点,我深表歉意,但我最近一直在研究和研究一堆面向对象的东西,所以我在这里仍处于学习阶段。)

最佳答案

(注意:一些建议,特别是如果您处于学习阶段 - 如果您确保您的示例代码编译了一些基线,那么人们可以更轻松地为您询问的部分调整工作版本. 编译器警告也很有指导意义,因此您可以提前发现错误...例如您缺少 Object 上的虚拟析构函数。如果我们不知道您是否知道为什么不好或不是。)


您正在尝试根据属性继承自哪些类将属性编码到对象中,然后在运行时检查这些属性。

技术上可以使用 Run-Time-Type-Information , 使用 dynamic_cast<>并注意它何时返回空指针。

Grass grass;
cout << dynamic_cast<Collidable *>(&grass) << "\n";

Monster monster;
cout << dynamic_cast<Collidable *>(&monster) << "\n";

当我运行时,我得到:

0
0xbfabb10c

所以草可以投,而怪物不能。这种简化的情况也会产生编译器警告:

warning: dynamic_cast of ‘Grass grass’ to ‘class Collidable*’ can never succeed [enabled by default]

但这并不是 C++ 方法论的真正意图。最好按照@bstar55 建议的思路思考并拥有一个虚拟 isCollidable()在所有对象上,有些返回 false。或者甚至考虑一个对象不是“可碰撞”的对象和一个碰撞测试总是失败的对象之间是否存在差异。这取决于您的系统设计。

与其尝试在运行时浏览类层次结构,不如将重点放在编译时工作时考虑使用继承或“特征”。这就是它真正的美。但这是一个深奥的话题。我只会给你指出一些像 std::is_base_ofa list of other type traits .

关于c++ - 如果某些类继承了抽象基类,则确定何时在某些类上使用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088390/

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