以下に、私が作成したコードの最小限の例を示します。私はこのコードを機能させることができましたが、採用されている慣行が正しいかどうかはわかりません。本質的に、私がやろうとしているのは、「パラメーター」クラスが「状態」クラスの選択要素を参照するようにすることです。そのため、状態の変数はパラメーターを介して変更できます。
私が持っている質問: アプローチは大丈夫ですか? そうでない場合、私が目指していることを達成するためのより良い方法はありますか?
コード例:
struct VAR_TYPE{
public:
bool is_fixed; // If is_fixed = true, then variable is a parameter
double value; // Numerical value
std::string name; // Description of variable (to identify it by name)
};
struct NODE{
public:
VAR_TYPE X, Y, Z;
/* VAR_TYPE is a structure of primitive types */
};
class States{
private:
std::vector <NODE_ptr> node; // shared ptr to struct NODE
std::vector <PROP_DICTIONARY_ptr> property; // CAN NOT be part of Parameter
std::vector <ELEMENT_ptr> element; // CAN NOT be part of Parameter
public:
/* ect */
void set_X_reference ( Parameter &T , int i ) { T.push_var( &node[i]->X ); }
void set_Y_reference ( Parameter &T , int i ) { T.push_var( &node[i]->Y ); }
void set_Z_reference ( Parameter &T , int i ) { T.push_var( &node[i]->Z ); }
bool get_node_bool_X( int i ) { return node[i]->X.is_fixed; }
// repeat for Y and Z
};
class Parameter{
private:
std::vector <VAR_TYPE*> var;
public:
/* ect */
};
int main(){
States S;
Parameter P;
/* Here I initialize and set S, and do other stuff */
// Now I assign components in States to Parameters
for(int n=0 ; n<S.size_of_nodes() ; n++ ){
if ( S.get_node_bool_X(n)==true ){
S.set_X_reference ( P , n );
};
// repeat if statement for Y and Z
};
/* Now P points selected to data in S, and I can
* modify the contents of S through P
*/
return 0;
};
アップデート
この問題が発生した理由は、Fortran のレガシー コードを使用しているためです。この Fotran コードを要約すると、これは飛行体の数値シミュレーションです。このコードには、許容される Fortran 型の定義済みリストが付属する、かなり厳格な手続き型フレームワークがあり、その中で作業する必要があります。Fortran グルー コードは、C++ オブジェクトのインスタンス (実際には、Fortran の観点からの参照) を作成できますが、その中に何が含まれているかは認識していません (C++ データを Fortran に抽出するために他の手段が使用されます)。
私が遭遇した問題は、C++ モジュールが Fortran グルー コードに動的にリンクされている場合で、C++ コードが呼び出されるたびに C++ オブジェクトを初期化する必要があります。これは、Fortran テンプレートがどのように定義されているかによって発生します。
このオブジェクトの再初期化のサイクルを回避するために、'State' をコンテナー クラスとして使用する予定です。Fortran コードでは、任意の定義を持つ「状態」オブジェクトを使用できます。しかし、モデルに関するすべての関連情報を活用するために使用する予定です。アイデアは、パラメーター クラス (Fortran コードによって公開および更新される) を使用して、状態の変数を更新することです。