如何根据类型为具有一般属性和特定属性的类建模。例如,我有一个原始类。 Primitive类具有以下常规成员:PrimitiveType,平移,旋转以及基于原始类型的其他字段。

enum PrimitiveType
{
   CYLYNDER,
   CUBE,
   CONE
}
class Primitive
{
   string name;
   PrimitiveType type;
   double positionX,positionY,positionZ;
   double rotationX,rotationY,rotationZ;

  // following members are if primitivetype is CYLYNDER
   double height;
   double radius;

  //following members are if primitive is CUBE
  double height;
  double width;
  double length;

};

我当然可以继承并制作从Primitive继承的Primitive和Cylynder和Cube类。但是类之间没有多态关系,因此我不使用继承。我只需要具有属性的普通结构即可。

我也可以进行合成,并制作具有Primitive成员的Cylynder和Cube类。但是我需要将Cylynder,Cube和Cone的对象存储在一个 vector 中。因此,如果我进行合成,我将如何将它们存储在一个std::vector中。

我基本上需要以满足以下要求的方式对结构进行建模:

1)将不同类型的组件的对象存储在一个std::vector中

2)将不同类型的对象存储在易于阅读和编辑的配置文件中。
在配置文件中,我只想保存与原始类型的特定类型相关的专用属性,而不是所有原始类型的专用属性。
所以我想在配置文件中得到这样的东西:
<Primitive>
 <name>Primitive1</name>
 <type>CYLYNDER</type>
 <positionx>0</positionx>
 <!-- other common attributes here, omitted to save space -->

 <!-- specific primitive type attributes -->
 <height> 10 </height>
 <redius>5</radius>
</Primitive>
<Primitive>
  <name> Primitive2 </name>
  <type> CUBE </type>
  <positionx>0</positionx>
  <!-- other common attributes here, omitted to save space -->

  <!-- specific primitive type attributes -->
  <height>10</height>
  <width>10</width>
  <length>10</length>
</Primitive>

最佳答案

您有很多选择,例如:

  • 创建三个不同的类,并将boost::variant<Cylinder, Cube, Cone> s存储在vector中(从概念上讲,这是一个有区别的联合,但是boost::variant会为您清理它并处理诸如对齐之类的丑陋情况)
  • 如果需要的话,您仍然可以将合成用于共享成员/功能
  • 创建一个带有枚举和“胖”接口(interface)和字段的类(就像您在上面开始做的那样,但是将高度的重复项删除到“//对于许多基元”组中)
  • 有点杂乱无章,但是如果您没有太多要处理的PrimitiveType,并且它们不太复杂,那么
  • 可能是可管理且实用的
  • 使用多态性-当然,似乎会有一些通用的功能子集可以公开,尽管它很丑陋dynamic_cast<>支持特定于运行时类型的切换
  • 您的“彼此之间没有多态关系,所以我不使用继承”并不是避免使用继承的令人信服的理由,因为您声称需要将类型存储在单个vector


  • 至于从文件内容创建对象……您所需要的称为“工厂”-它可以从配置文件中读取PrimitiveType,然后调用特定于类型的字段解析,最后调用构造代码。

    09-06 06:49
    查看更多