这适用于游戏引擎"作为一点编程实践。我的所有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类中的一些函数来评估需求,以检查它是否为有效配置。这可以解决问题。
答案 0 :(得分:1)
乍一看,我会使用工厂模式来解决您的问题。这样,您可以创建类来创建给定不同字符串的对象,而无需在编译时指定所需的确切类,这与普通的类型构造函数不同。我看到人们使用的类比是Virtual Constructors。
http://www.oodesign.com/factory-pattern.html
从本质上讲,你将拥有一个工厂地图(创造者对象)。