gpt4 book ai didi

c++ - 读取初始化列表中的数据

转载 作者:行者123 更新时间:2023-11-30 04:21:16 25 4
gpt4 key购买 nike

在类实例化时,我想从文件中读取数据并将其处理为多个类对象。到目前为止我所做的(并且效果很好)是

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

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

最佳答案

您可能会考虑在类似工厂的静态方法中拆分数据加载/处理,该方法又构造一个 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 类的成员。

关于c++ - 读取初始化列表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com