1

下面,我提供了一个我创建的代码的最小示例。我设法让这段代码正常工作,但我不确定所采用的做法是否合理。本质上,我想做的是让“参数”类引用选择“状态”类中的元素,因此可以通过“参数”更改状态中的变量。

我有问题:这种方法是否可行?如果没有,有没有更好的方法来实现我的目标?

示例代码:

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 代码公开和更新)来更新状态中的变量。

4

1 回答 1

1

你正在做的是合法的 C++(虽然代码的某些部分丢失了,所以我不得不猜测它们做了什么)——你可以像这样获取成员变量的指针和引用。但是这是否道德(或“合理”)的问题在很大程度上取决于情况。

在我看来,您试图隐藏x特定对象属于您的Parameter类型的数据成员(等)的语义。因此,当实际访问您VAR_TYPE*收藏的内容时,您不会拥有该信息。

这可能是需要的,也可能是代码异味。我倾向于后者。如果x,yz可以充当类似的角色,最好将它们替换为一个 std::array<VAR_TYPE,3>并通过索引访问它们,而不是费力地创建这种包装器类型,该包装器类型的唯一目的是准确地添加这种间接访问功能。

于 2012-09-23T06:04:12.757 回答