如何将某个父级的所有子类注册到不同的类
How do I register all subclasses of a certain parent to a different class
我正在设计一个应用程序,其中多个几何基元类型(都继承基Primitive
类)存储在类 Scene
的对象中。
我不想在我的main()
中有一个函数,通过构造基元然后调用Scene::add(...)
以编程方式创建场景,而是希望拥有某种在运行时读取的配置文件。
这将使我不必在每次更改场景时重新编译,并且似乎是一个普遍的好主意(以防其他无法编程的人可能需要在某个时候使用我的程序)
我设计了一个小方案,通过一个.ini
文件定义场景,如下所示:
[primitivefoo]
type = sphere
pos = 10 20 30
radius = 5.5
[primitivebar]
type = triangle
vertexA = 10 10 -10
vertexB = ...
...
你明白了。
我的计划是让Primitive
的每个子类在类Scene
中注册自己的方法interpretINI(...)
。 Scene
需要某种映射 string
-> void* (...)
,以便我知道 .ini
文件中的哪个类型字符串对应于 Primitive
的哪个子类。
如果这整个方法都是糟糕的设计,并且已经有一种更优雅的方式来实现我想要实现的目标,我很想听听。如果没有,如果有人能帮助我实现我的设计,我将不胜感激。我坚持如何迭代所有Primitive
子类,让它们在Scene
中注册自己......
你的方法对我来说听起来不错,除了名称应该映射到返回Primitive*
(而不是void*
)的函数。 这是一个工厂模式(在两个层面上)
此方法的一个限制是注册的工厂函数必须接受相同数量/类型的参数。 [更新:在阅读您对问题的评论后,这在您的情况下应该不是问题]。
我不知道任何自动枚举特定类的子类的方法,您需要手动注册已知类(在 main 或特殊的 register
函数中)
更新:您可以使用静态变量(类内或其他变量)绕过子类枚举,这些变量将运行特定于相关类的"寄存器"函数:
class MyShape : public Shape
{
static int reg;
// appropriate constructor
};
int registerMyShape();
int MyShape::reg = registerMyShape(); // this will be called at program startup
唯一的问题是,无法保证单独编译单元中的静态初始化顺序。 也许您可以使形状像模块一样并在注册表类完全初始化后"加载"它们?
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何将某个父级的所有子类注册到不同的类
- 用管理器注册一个类,然后调用子类被覆盖的方法