下面,我提供了一个我创建的代码的最小示例。我设法让这段代码正常工作,但我不确定所采用的做法是否合理。本质上,我想做的是让“参数”类引用选择“状态”类中的元素,因此可以通过“参数”更改状态中的变量。
我有问题:这种方法是否可行?如果没有,有没有更好的方法来实现我的目标?
示例代码:
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 模板的定义方式。
为了避免这种重新初始化对象的循环,我计划使用“状态”作为容器类。Fortran 代码允许使用任意定义的“状态”对象;但我计划用它来利用有关模型的所有相关信息。这个想法是使用参数类(由 Fortran 代码公开和更新)来更新状态中的变量。