我打算编写一个代码,其类具有如下继承关系并具有与材料类型相关的各种属性:
- 抽象基类
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
另外定义常量PIEZO_CONST_MATRIX
。
棘手的事情是确保可以一起使用的所有常量都不具有相同的值。这可以通过使用脚本生成头文件来实现,该脚本将这些常量的值设置为唯一值。
让 PropertyLabel 成为一个std::string
从这里我可以采取几种不同的方式。我可以只"ELASTICITY_MATRIX"
在代码中使用字符串文字,并依赖这些文字永远不会拼写错误——一个会在运行时而不是编译时捕获的错误。我可以用类似于上述整数常量方案的方式定义字符串常量,并且保持常量唯一的任务将是微不足道的:只需设置to的值、 ELASTICITY_MATRIX
to"ELASTICITY_MATRIX"
的值等。POISSONS_RATIO
"POISSONS_RATIO"
除了额外的开销之外,我看到的问题是我看到了与非 POD 的全局静态常量相关的恐怖故事,例如非整数常量和定义类字符串常量主题中的评论中的那些C++?. 我想我可以让全局静态常量是数组,它们是当用作映射键时const char[]
会隐式转换为 s 的 POD (并且,不,我不打算让映射键本身成为)。我还可以使用预处理器定义字符串文字,但是我无法将它们保存在命名空间中。std::string
const char*
您会推荐上述任何一种方法吗?里面有没有我没注意到的隐藏陷阱?您还有其他方法可以推荐吗?