【发布时间】:2012-09-03 20:21:48
【问题描述】:
我打算编写一个代码,其中的类具有如下继承关系,并具有与材料类型相关的各种属性:
- 抽象基类
Foo。没有与之关联的属性。 -
Foo1GeneralElastic继承自 Foo 类并具有与可能各向异性弹性材料相关的属性。 -
Foo2GeneralElastic也继承自 Foo 类,具有与Foo1GeneralElastic相同的材质属性,但在其他方面有所不同。 -
Foo1PiezoElastic继承自Foo1GeneralElastic,具有压电特性和通用弹性特性。 -
Foo1IsotropicElastic继承自Foo1GeneralElastic,但不共享其属性。
我决定抽象基类将具有一个或多个方法,这些方法采用MyPropMap 类型的映射,定义为:
typedef std::map<PropertyLabel,std::vector<double> > MyPropMap
对于 PropertyLabel 类型可能有几个不同的选项,我正在尝试权衡每种选项的优缺点:
让 PropertyLabel 成为 enum:这将是轻量级的,但它基本上是一袋标签,用于我正在考虑的每种材料的所有不同属性。
让 PropertyLabel 只是一个 int:在这里,我将为每种材料类型提供单独的头文件,每个文件都包含静态整数常量的定义,这些常量将是相关材料特性。例如,MatPropKeyGenElastic.hpp 将定义整数常量 ELASTICITY_MATRIX,MatPropKeyIsotropicElastic.hpp 将定义常量 ELASTIC_MODULUS 和 POISSONS_RATIO,而 MatPropKeyPiezoElastic.hpp 将 #include 文件 MatPropKeyGenElastic.hpp 并另外定义常量 @987654343 @。
棘手的事情是确保可以一起使用的所有常量都不会具有相同的值。这可以通过使用脚本生成头文件来实现,该脚本将这些常量的值设置为唯一值。
让 PropertyLabel 成为 std::string 从这里我可以采取几种不同的方式。我可以只在代码中使用像"ELASTICITY_MATRIX" 这样的字符串文字,并依赖这些文字永远不会拼写错误——一个会在运行时而不是编译时捕获的错误。我可以用类似于上述整数常量方案的方式定义字符串常量,保持常量唯一的任务很简单:只需将ELASTICITY_MATRIX 的值设置为"ELASTICITY_MATRIX",将POISSONS_RATIO 的值设置为@987654349 @等
除了额外的开销之外,我看到的问题是我看到了与非 POD 的全局静态常量相关的恐怖故事,例如主题 non-integral constants 和 Defining class string constants in C++? 中的 cmets .我想我可以将全局静态常量设置为 const char[] 数组,这些 POD 在用作映射键时会隐式转换为 std::strings(并且,no,我不打算让地图键本身为const char*)。我也可以使用预处理器定义字符串文字,但是我无法将它们保存在命名空间中。
您会推荐以上任何一种方法吗?里面有没有我没注意到的隐藏陷阱?您还有其他方法可以推荐吗?
【问题讨论】:
标签: c++