我正在尝试用C ++制作自己的CBGE(基于组件的游戏引擎),但我仍然坚持这个问题:如何找到一个对象属于一个特定的类?或者用指针等效,如何找到指针指向特定类的对象?让我举个例子:
我的代码中有这个地方:
//ComponentManager.h
...
std::map<rUUID, std::vector<Component*>> bucket;
...
其中rUUID是表示UUID的类,而Component是一个抽象类 表示实体可以拥有的所有类型的组件。
现在我如何获得给定rUUID的特定类型的组件(e.x. PositionComponent)?
也可以有人告诉我这种设计是好还是坏的做法,如果是这样的话 应该成立吗?
答案 0 :(得分:1)
如果类Foo
有一些虚拟方法,并且您的编译器支持RTTI,则可以检查dynamic_cast<Foo*>(p) != NULL
以检查p
是否指向{{1}的某个实例(假设Foo
被声明为p
的某些超类Bar *p;
的指针Bar
注意:如果Foo
指向某个dynamic_cast<Foo*>(p) != NULL
子类的实例,true
将返回p
。
另请参阅<typeinfo>
header和Foo
(正如BlackMamba在其他答案中所建议的那样)。
答案 1 :(得分:1)
RTTI效果很好,但我想再展示一次。
如我所见,您的所有实例都属于Component-class。在这种情况下,您可以在Component中创建自己的虚拟方法供自己使用。像这样:
class Component
{
virtual std::string
type() const = 0;
};
class someComponent : public Component
{
virtual std::string
type() const { return "someComponent"; }
};
通过这种方式,您可以获得额外的优势。例如,为完全不同的类创建相同的类型。或者,执行比返回类型更复杂的操作。并且您的编译器不必具有RTTI。
答案 2 :(得分:1)
也许,你可以使用这个函数:typeid()