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_);
}

我不喜欢这种方法的是

  • 数据被初始化两次:一次(void)在初始化列表中,一次在构造函数中填充实际内容;然后
  • 我无法将任何(已处理)数据对象标记为const.

有没有办法组织对象创建,使其全部发生在初始化列表中?

4

2 回答 2

1

向 const 成员变量(不使用 const cast 或使用 mutable 关键字)提供值的唯一方法是在构造函数初始化程序列表中提供它。请参阅:如何在构造函数中初始化 const 字段

如果您不想避免使用“丑陋”的强制转换或关键字,并且需要您的数据是 const(例如用于 const 函数),我会选择一个小的 myDataInitialiser 类,它会首先读取数据。读取数据后,您可以将初始化程序的整个实例传递给原始 myData 类的构造函数。

于 2013-01-30T18:06:34.513 回答
1

您可能会考虑在类似工厂的静态方法中拆分数据加载/处理,该方法又构造一个 myData 实例(将 processesData*_ 值作为构造函数参数传递)。

通过这种方式,您可以将加载和处理与可能最终仅存储结果并可能提供进一步处理或访问部分数据的类分开。

可以像

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), ..)
}

为你工作?

我假设您在加载和处理数据时不需要保持状态。如果不是这种情况,您可以创建一个类read的成员。createProcessedData*MyDataLoader

于 2013-01-30T18:12:05.433 回答