引用结构/C++中的变量

Referencing variables in a structure / C++

本文关键字:变量 C++ 结构 引用      更新时间:2023-10-16

下面,我提供了一个我创建的代码的最小示例。我设法使这段代码正常工作,但我不确定所采用的做法是否合理。本质上,我试图做的是让"Parameter"类引用选择"States"类中的元素,这样States中的变量就可以通过Parameters进行更改。

我的问题是:采取的方法可以吗?如果没有,有没有更好的方法来实现我的目标?

示例代码:

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遗留代码。总之,这是一个飞行飞行器的数值模拟。这段代码有一个相当严格的过程框架,必须在其中工作,它附带了一个预定义的允许Fortran类型列表。Fortran粘合代码可以创建C++对象的实例(实际上,从Fortran的角度来看是一个引用),但不知道其中包含什么(使用其他方法将C++数据提取到Fortran中)。

我遇到的问题是,当C++模块动态链接到Fortran粘合代码时,每次调用C++代码时,都必须初始化C++对象。这取决于Fortran模板的定义方式。

为了避免这种重新初始化对象的循环,我计划使用"State"作为容器类。Fortran代码允许一个具有任意定义的"State"对象;但我计划使用它来利用有关该模型的所有相关信息。其思想是使用Parameters类(它由Fortran代码公开和更新)来更新States中的变量。

您正在做的是合法的C++(尽管代码的某些部分丢失了,所以我必须猜测它们是做什么的)--您可以获取指向这样的成员变量的指针和引用。但这是否合乎道德(或"合理")在很大程度上取决于情况。

在我看来,您试图用Parameter类型隐藏特定对象所属的数据成员(x等)的语义。因此,在实际访问VAR_TYPE*集合的内容时,您将没有这些信息。

这可能是想要的,也可能是代码的味道。我倾向于后者。如果xyz可以扮演类似的角色,那么最好用一个std::array<VAR_TYPE,3>来替换它们,并通过索引来访问它们,而不是麻烦地创建这种包装类型,它的唯一目的是添加这种间接访问功能。