2

3D グリッドで動作するプログラムがあります。このグリッドには、次のような独自のクラス オブジェクト Grid があります (簡略化されたバージョン)。

class Grid
{
  public:
    Grid() { readDataFromInputFile(); }
  private:
    void readDataFromInputFile() {...} // this function reads the values for i, j, k from disk
    int i; int j; int k;
};

私が今やりたいことは、変数 i、j、k を const int として設定できるようにして、他の関数で誤って混乱させないようにすることです。ただし、ファイルから読み取る必要があるため、メンバー初期化子リストに簡単に設定することはできません。既存の議論を閲覧してきましたが、この問題に関する正確な議論を見つけることができませんでした。

それらをconstとして設定し、複雑な関数を使用してデータを取得できるソリューションはありますか? 私の実際のアプリケーションでは、もちろん、初期化後に変更することを許可されていない、もっと多くの変数を読み取る必要があります。

4

2 に答える 2

8

1 つの責任の原則を破らないでください: AGridは、ファイルから自身をロードする責任を負うべきではありません。これは、別のコンポーネントの責任です (たとえば、単純なロード関数)。

class Grid
{
public:
    Grid( int ii , int jj , int kk ) : i{ ii } , j{ jj } , k{ kk }
private:
    const int i , j , k;
};

Grid loadGrid( constd std::string& filename )
{
    ...
};
于 2014-08-03T12:51:25.980 に答える
3

複雑な振る舞いを持つ const メンバーの設定を解決する 1 つの方法は、関数を使用してそれらを初期化することです。あなたの場合、私が正しく理解していれば、これらのメンバーは 1 つの関数呼び出しを使用して初期化されるため、その関数がメンバーの値を返すだけで const メンバーを設定できるようにする方がよいでしょう。次のようになります。

class Grid
{
  public:
    Grid() : data( readFromInputFile() ) {  }
  private:
    struct Data{
    int i; int j; int k;
    };
    const Data data;
};

この単純な代替手段で問題が解決するはずです。変更する唯一のことは、データへのアクセス方法、つまり i ではなく data.i です。データが初期化されると (readFromInputFile() もデータを返す)、変更することはできません。

readFromInputFile() をメンバー関数または静的メンバー関数にしない必要がある場合は、Data の定義をクラスの外に移動するか、パブリックにします。

于 2014-08-03T12:51:17.570 に答える