如何根据类型为具有一般属性和特定属性的类建模。例如,我有一个原始类。 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
会为您清理它并处理诸如对齐之类的丑陋情况)dynamic_cast<>
支持特定于运行时类型的切换vector
至于从文件内容创建对象……您所需要的称为“工厂”-它可以从配置文件中读取PrimitiveType,然后调用特定于类型的字段解析,最后调用构造代码。