gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:51 36 4
gpt4 key购买 nike

这是针对“游戏引擎”的一些编程实践。我所有的游戏对象都是基于组件的,其中每个组件都会向其父游戏对象添加一个功能,并且所有这些组件都派生自一个基类 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 可以做到这一点,但我认为类型名称甚至“不是”任何东西除了人类可读的编译器提示之外,所以我不能将它用作 HashMap 值。

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

编辑 1:

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

最佳答案

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

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

本质上,您将拥有工厂(创建者对象)的 map 。

  1. 为您的组件定义一些顶级接口(interface),例如 IComponent。
  2. 为您要生成的每个具有创建实例方法的组件定义一个工厂类。我建议 Create Instance 方法应该是 IFactory 等接口(interface)的一部分。
  3. 在您的程序设置过程中创建您的 map 并将工厂分配给特定的键。 ActorCreator["MyComponent"] = new MyComponentFactory();
  4. 当您想要创建一个从 XML 节点读取的对象时,您只需调用返回的工厂中的创建实例方法来获取 key 。 auto myComponent = ActorCreator[readXML]->CreateInstance();
  5. 您现在有一个参与者/组件,其具体类型是在运行时而不是编译时确定的。

关于c++ - 多态类型的代理类,使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635932/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com