1

クラスのインスタンス化時に、ファイルからデータを読み取り、それをいくつかのクラスオブジェクトに処理したいと思います。私がこれまでにしたこと(そしてうまくいくこと)は

myData::myData(const std::string & file):
  data1_(this->read(file)),
  processedData1_(this->createProcessedData1_(data1_)),
  processedData2_(this->createProcessedData2_(data1_)),
  processedData3_(this->createProcessedData3_(data1_))
{
}

別のクラスでは、read()メソッドは複数の生データオブジェクトを作成します。この場合、イニシャライザリストにパックする方法がわからないので、次のように実行しています。

myData::myData(const std::string & file):
  data1_(),
  data2_(),
  processedData1_(),
  processedData2_(),
  processedData3_()
{
  this->read(file); // fills data1_, data2_
  processedData1_ = this->createProcessedData1_(data1_, data2_);
  processedData2_ = this->createProcessedData2_(data1_, data2_);
  processedData3_ = this->createProcessedData3_(data1_, data2_);
}

このアプローチについて私が気に入らないのは、

  • データは2回初期化されます。1回は初期化子リストで(void)、もう1回はコンストラクターで実際のコンテンツで埋められます。そしてそれ
  • (処理された)データオブジェクトをとしてマークすることはできませんconst

すべてが初期化リストで行われるようにオブジェクトの作成を整理する方法はありますか?

4

2 に答える 2

1

constメンバー変数に値を提供する唯一の方法(constキャストなし、または可変キーワードを使用)は、コンストラクター初期化子リストに値を提供することです。これを参照してください:コンストラクターでconstフィールドを初期化する方法

「醜い」キャストやキーワードを控えたくない場合で、データをconstにする必要がある場合(たとえば、const関数で使用する場合)、最初にデータを読み取る小さなmyDataInitialiserクラスを使用します。データが読み取られると、初期化子のインスタンス全体を元のmyDataクラスのコンストラクターに渡すことができます。

于 2013-01-30T18:06:34.513 に答える
1

工場のような静的メソッドでデータのロード/処理を分割して、myDataインスタンスを構築することを考えるかもしれません(processedData * _値をコンストラクターパラメーターとして渡します)。

このようにして、ロードと処理をクラスから分離しておくことができます。クラスは結果を保存するだけで、データの一部にさらに処理またはアクセサーを提供する可能性があります。

のようなものでしょうか

class MyData {
public:
    MyData(DataType processedData1, ...) : processedData1_(processedData1) ... { }
private:
    const DataType processedData1_;
}

struct DataContainer {
    DataType data1;
    DataType data2;
}

DataContainer read(const std::string& file) { ... }

DataType createProcessedData1(DataType data) { ... }
...

// hands ownership to caller
MyData* LoadData(const std::string & file) {
    DataContainer d = read(file);
    return new MyData(createProcessedData1(d.data1), createProcessedData2(d.data2), ..)
}

あなたのために働きますか?

データを読み込んで処理するときに状態を保持する必要はないと思います。そうでない場合は、クラスreadcreateProcessedData*メンバーを作成できます。MyDataLoader

于 2013-01-30T18:12:05.433 に答える