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

时间:2014-09-03 03:50:34

标签: c++ class templates polymorphism proxy-classes

这适用于游戏引擎"作为一点编程实践。我的所有GameObject都是基于组件的,其中每个组件都向其父GameObject添加一个功能,所有这些组件都来自一个基本的Component类,它具有虚拟方法使其具有多态性。

当我从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时从字符串中指定该模板类型代替什么。我认为hashmap可以做到但我不认为类型名称甚至&#34;是&#34;除了人类可读的编译器提示之外的任何东西,所以我不能将它用作hashmap值。

可以这样做,我该如何实施呢?将一些字符串文字插入到魔法的黑盒子中#34;并得到一些可以用作模板参数的东西。如果它有所帮助,那么所有的东西都将成为&#34; T&#34;是多态的。 或者是否有更好的解决方案来解决我的问题。它需要能够充当我放入其中的任何组件,并且需要在运行时可以辨别。

编辑1:

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

1 个答案:

答案 0 :(得分:1)

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

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

从本质上讲,你将拥有一个工厂地图(创造者对象)。

  1. 为组件定义一些顶级接口,例如IComponent。
  2. 为要生成的具有“创建实例”方法的每个组件定义工厂类。我建议Create Instance方法应该是IFactory之类的接口的一部分。
  3. 在程序设置期间,创建地图并将工厂分配给特定键。 ActorCreator [“MyComponent”] = new MyComponentFactory();
  4. 如果要创建从XML节点读取的对象,只需在返回的工厂上为该键调用create instance方法即可。 auto myComponent = ActorCreator [readXML] - &gt; CreateInstance();
  5. 您现在有一个actor /组件,其具体类型已在运行时而不是编译时决定。