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 テンプレートがどのように定義されているかによって発生します。

このオブジェクトの再初期化のサイクルを回避するために、'State' をコンテナー クラスとして使用する予定です。Fortran コードでは、任意の定義を持つ「状態」オブジェクトを使用できます。しかし、モデルに関するすべての関連情報を活用するために使用する予定です。アイデアは、パラメーター クラス (Fortran コードによって公開および更新される) を使用して、状態の変数を更新することです。

4

1 に答える 1

1

あなたがしていることは正当な C++ です (ただし、コードのいくつかの部分が欠落しているため、それらが何をするかを推測する必要があります) --このようにメンバー変数へのポインターと参照を取得できます。しかし、これが道徳的(または「健全」)であるかどうかは、状況によって大きく異なります。

x特定のオブジェクトがあなたのタイプに属するデータメンバー( など)のセマンティクスを隠そうとしているように思えますParameter。そのため、実際にVAR_TYPE*コレクションのコンテンツにアクセスするとき、その情報はありません。

それは望ましいことかもしれませんし、コードの匂いかもしれません。私は後者に傾いています。とが同様の役割を果たすことができる場合xは、この間接アクセス機能を正確に追加するという唯一の目的を果たすこのラッパー タイプを作成する手間をかけるよりも、それらを1 つに置き換えてインデックスでアクセスする方がよい場合があります。yz std::array<VAR_TYPE,3>

于 2012-09-23T06:04:12.757 に答える