0

我正在设计一个应用程序,其中多个几何基本类型(都继承基Primitive类)存储在 class 的对象中Scene

我不想在我的函数中main()通过构造基元然后调用以编程方式创建场景Scene::add(...),而是希望有某种在运行时读取的配置文件。
这将使我不必在每次更改场景时都重新编译,这似乎是一个普遍的好主意(以防无法编程的其他人有时可能需要使用我的程序)

我设计了一个小方案,通过.ini这样的文件定义场景:

[primitivefoo]
type = sphere
pos = 10 20 30
radius = 5.5

[primitivebar]
type = triangle
vertexA = 10 10 -10
vertexB = ...
...

你明白了。

我的计划是让每个子类在类中注册Primitive自己的方法。需要某种映射->的映射,以便我知道文件中的哪个类型字符串对应于.interpretINI(...)SceneScenestringvoid* (...).iniPrimitive

如果整个方法是糟糕的设计,并且已经有一种更优雅的方式来实现我想要实现的目标,我很想听听。如果没有,如果有人能帮助我实现我的设计,我将不胜感激。我被困在如何迭代所有Primitive子类以让它们在Scene...中注册自己

4

1 回答 1

3

您的方法对我来说听起来不错,除了名称应该映射到返回的函数Primitive*(而不是void*)。这是工厂模式(在两个级别上)

这种方法的一个限制是注册的工厂函数必须接受相同数量/类型的参数。[更新:在阅读您对问题的评论后,这对您来说应该不是问题]。

我不知道枚举特定类的子类的任何自动方式,您需要手动注册已知类(在主类或特殊register函数中)

更新:您可以通过使用静态变量(类内或其他)来绕过子类枚举,这些变量将运行特定于问题类的“注册”函数:

class MyShape : public Shape
{
  static int reg;
  // appropriate constructor
};

int registerMyShape();

int MyShape::reg = registerMyShape(); // this will be called at program startup

唯一的问题是,不能保证单独编译单元中的静态初始化顺序。也许您可以在注册表类完全初始化后使形状类似于模块并“加载”它们?

于 2012-05-24T10:31:38.057 回答