引用结构/C++中的变量
Referencing variables in a structure / C++
下面,我提供了一个我创建的代码的最小示例。我设法使这段代码正常工作,但我不确定所采用的做法是否合理。本质上,我试图做的是让"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*
集合的内容时,您将没有这些信息。
这可能是想要的,也可能是代码的味道。我倾向于后者。如果x
、y
和z
可以扮演类似的角色,那么最好用一个std::array<VAR_TYPE,3>
来替换它们,并通过索引来访问它们,而不是麻烦地创建这种包装类型,它的唯一目的是添加这种间接访问功能。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用