0

我正在尝试在 C++ 中制作自己的 CBGE(基于组件的游戏引擎),但我被困在这个问题上:如何查找对象是否属于特定类?或与指针等效,我如何找到指针是否指向特定类的对象?让我举个例子:

我的代码中有这个:

//ComponentManager.h
...
std::map<rUUID, std::vector<Component*>> bucket;
...

其中 rUUID 是一个代表 UUID 的类,而 Component 是一个抽象类,代表一个实体可以拥有的所有类型的组件。

现在我怎样才能为给定的 rUUID 获取特定类型的组件(例如 PositionComponent)?

也有人可以告诉我这种设计是好的还是坏的做法,如果是这样,它应该如何形成?

4

3 回答 3

1

如果该类Foo有一些虚拟方法并且如果您的编译器支持RTTI,您可以检查dynamic_cast<Foo*>(p) != NULL是否p指向某个实例Foo(假设它p被声明为指向Bar *p;某个超类Bar的指针Foo

注意:如果指向某个子类的实例,dynamic_cast<Foo*>(p) != NULL将返回.truepFoo

另请参阅<typeinfo>标题typeid(正如BlackMamba在另一个答案中所建议的那样)。

于 2013-06-08T17:35:37.517 回答
1

RTTI 效果很好,但我想展示另一种方式。

如我所见,您的所有实例都属于组件类。在这种情况下,您可以在 Component 内部创建自己的虚拟方法以供自己使用。像这样:

class Component
{
    virtual std::string
    type() const = 0;
};

class someComponent : public Component
{
    virtual std::string
    type() const { return "someComponent"; }
};

通过这种方式,您可以获得额外的优势。例如,为完全不同的类创建相同的类型。或者,执行比返回类型更复杂的操作。而且您的编译器不必具有 RTTI。

于 2013-06-08T20:45:28.190 回答
1

也许,你可以使用这个函数:typeid()

于 2013-06-09T10:11:58.920 回答