多态类型的代理类,使用模板

Proxy class for polymorphic type, using templates

本文关键字:类型 代理 多态      更新时间:2023-10-16

这是针对"游戏引擎"的编程实践。我所有的GameObject都是基于组件的,每个组件都向其父GameObject添加了一个功能,所有这些组件都来自一个基本组件类,该类具有使其多态的虚拟方法。

当我从XML文件中读取这些游戏对象定义时,一些组件需要了解其他组件,例如,物理组件需要了解用于物理计算的转换组件。然而,如果XML文件中不存在这些组件,那么它偶尔会抛出令人讨厌的空指针和无休止的兔子洞调用堆栈,以查找我在半睡半醒时弄糊涂的XML拼写错误。

我的解决方案是在XML文件中有一个节点,作为这种类型的组件应该存在的断言,如果不存在,可能会引发异常或其他适当的操作。例如

<ComponentRequirement type="ComponentTransform">myTransformComponent</ComponentRequirement>

所以我需要一种在C++中表示这一点的方法。第一个想法是,根据代理的组件类型来更改模板类,因为这个类需要像它们的未装箱组件一样工作。我已经通过一些运算符重载解决了这个问题,只要类是一个模板类。

template <class T>
class ComponentRequirement {
public:
    T* operator->() { (I chose the arrow operator because the CompReq class will never be referenced as a pointer)
        return this->component;
    }
//Other unrelated functions . . . 
private:
    T* component;
};

在编译时这一切都很好,因为我可以说

ComponentRequirement<ComponentTransform> req = ComponentRequirement("myComponentTransform");

但当我在中读取XML时,我需要能够从字符串中指定代替的模板类型。我认为哈希映射可以做到这一点,但我认为类型名称甚至"不是"人类可读的编译器提示,所以我不能将其用作哈希映射值。

这能做到吗?我该如何着手实施它?将一些字符串文字插入到"魔法黑盒"中,并获得可以用作模板参数的内容。如果它有帮助的话,所有"T"的值都是多态的。或者我的问题有更好的解决方案吗。它需要能够充当我放入其中的任何组件,并且它需要在运行时是可辨别的。

编辑1:

在我的组件中,我有一个读写功能。如果我阅读了其中的组件要求,我可以确保模板具有正确的值,因为每个组件都是独立的。然后,我可以使用虚拟函数和gameobject类中的一些函数来评估需求,以检查它是否是有效的配置。这可以解决问题。

乍一看,我会使用工厂模式来解决您的问题。这样,您就可以创建类来创建给定不同字符串的对象,而无需在编译时指定所需的确切类,这与普通类型构造函数不同。我看到人们使用的比喻是虚拟建设者。

http://www.oodesign.com/factory-pattern.html

本质上,你会有一个工厂(创建者对象)的地图。

  1. 为组件定义一些顶级接口,例如IComponent
  2. 为要生成的每个具有"创建实例"方法的组件定义一个工厂类。我建议创建实例方法应该是像IFactory这样的接口的一部分
  3. 在程序设置过程中,创建映射并将工厂分配给特定的密钥。ActorCreator["MyComponent"]=新的MyComponentFactory()
  4. 当您想创建一个从XML节点读取的对象时,只需在返回的键工厂上调用create实例方法即可。auto-myComponent=ActorCreator[readXML]->CreateInstance()
  5. 现在您有了一个actor/components,它的具体类型是在运行时而不是编译时决定的