次のような継承関係を持ち、マテリアル タイプに関連付けられたさまざまなプロパティを持つクラスを含むコードを作成する予定です。
- 抽象基本クラス
Foo
。それに関連付けられたプロパティはありません。 Foo1GeneralElastic
クラス Foo から継承し、おそらく異方性弾性材料に関連付けられたプロパティを持ちます。Foo2GeneralElastic
もクラス Foo から継承し、 と同じ種類のマテリアル プロパティを持ちますがFoo1GeneralElastic
、それ以外は異なります。Foo1PiezoElastic
Foo1GeneralElastic
圧電特性と一般的な弾性特性の両方を継承し、両方を備えています。Foo1IsotropicElastic
から継承しFoo1GeneralElastic
ますが、そのプロパティを共有しません。
MyPropMap
抽象基本クラスには、次のように定義されたtype のマップを受け取るメソッドが 1 つ以上あると判断しました。
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
。
注意が必要なのは、一緒に使用できる定数が同じ値にならないようにすることです。これは、これらの定数の値を一意の値に設定するスクリプトを使用してヘッダー ファイルを生成することで実現できます。
std::string
ここから、いくつかの異なる方法を取ることができます。コードのよう"ELASTICITY_MATRIX"
に文字列リテラルを使用し、これらのリテラルのつづりを決して間違えないようにすることもできます。つまり、コンパイル時ではなく実行時に検出されるエラーです。上記の整数定数のスキームに似た方法で文字列定数を定義できます。定数を一意に保つタスクは簡単です。 to の値、 to の値などを設定するだけELASTICITY_MATRIX
です。"ELASTICITY_MATRIX"
POISSONS_RATIO
"POISSONS_RATIO"
余分なオーバーヘッドは別として、私が目にするキャッチは、非 POD のグローバル静的定数に関連するホラー ストーリーを見たことです。トピックの非整数定数およびクラス文字列定数の定義のコメントにあるようなものです。 C++? . グローバル静的定数を配列にすることができると思います。これは、マップ キーとして使用すると暗黙的に s にconst char[]
変換される POD です(いいえ、マップ キー自体を にするつもりはありません)。プリプロセッサを使用して文字列リテラルを定義することもできましたが、それらを名前空間内に保持できませんでした。std::string
const char*
上記のアプローチのいずれかをお勧めしますか? 私が気付かなかった隠されたトラップがありますか?あなたが推奨する他のアプローチはまだありますか?