我将称为“所有者”的一个对象在其生命周期内对数据对象向量具有明确的所有权。
这些被存储为unique_ptr的向量。
一个称为“输出”的对象/类需要以许多不同的方法查看这些数据对象,因此某种类型的引用/指针/变量是“输出”的成员变量。
输出在其构造函数中接收数据对象的向量。
我已经想到了三种实现此目的的方法。什么是最佳方式?
选项1-“输出”对象将数据vec存储为const引用:
class Output {
// output wants the data:
public:
Output(std::vector<std::unique_ptr<Data>> const & in)
: my_lot_of_data(in) {
};
std::vector<std::unique_ptr<Data>> const & my_lot_of_data;
}
由“所有者”实例化为:
data_vec_.push_back(std::unique_ptr<Data>(new Data));
/* stuff happens to data */
Output output(data_vec_);
选项2-“输出”对象将数据vec存储为const指针:
class Output {
// output wants the data:
public:
Output(std::vector<std::unique_ptr<Data>> const * in)
: my_lot_of_data(in) {
};
std::vector<std::unique_ptr<Data>> const * my_lot_of_data;
}
由“所有者”实例化为:
data_vec_.push_back(std::unique_ptr<Data>(new Data));
/* stuff happens to data */
Output output(&data_vec_);
选项3-“输出”对象接收原始指针:
class Output {
// output wants the data:
public:
Output(std::vector<Data*> in)
: my_lot_of_data(in) {
};
std::vector<Data*> const my_lot_of_data;
};
由“所有者”实例化为:
data_vec_.push_back(std::unique_ptr<Data>(new Data));
/* stuff happens to data */
std::vector<Data*> data_as_raw;
data_as_raw.resize(data_vec_.size());
std::transform(data_vec_.begin(), data_vec_.end(), data_as_raw.begin(), [](std::unique_ptr<Data> const & x) {return x.get();});
Output output(data_as_raw);
附加查询:在选项1和2中,即使将OutputOutput存储为unique_ptrs,它是否也没有数据所有权?选项3在呼叫站点是否混乱?要获得相同的结果,还需要3行。
什么是最佳做法?
由于您使用的是unique_ptr,因此您不打算与任何可能比所有者持续更长的时间共享此数据,因此,简单的const引用应该很好。我会推荐一个不错的typedef:
typedef std::vector<std::unique_ptr<Data>> OwnerDataSet;
Output(const OwnerDataSet &in)
方法1的优点是它简单明了。其他人只是毫无理由地使它复杂化。
unique_ptr的功能是在销毁std :: vector时删除新数据。这里的替代方法是复制Data的实例,而不是调用new。如果不需要使用指针,则不需要像unique_ptr这样的特殊处理来确保它们的安全。
typedef std::vector<Data> OwnerDataSet;
OwnerDataSet results;
Data match = findoneresult();
results.push_back(match); // copy something from Owner
Output (results);
更进一步,从您的示例中尚不清楚为什么要在Output类之外维护std :: vector。由于您在传递的所有内容上都调用std :: unique_ptr(new T),因此我怀疑您仅将其与Output一起使用,因此可以这样做:
class Output : public std::vector<Data> {
void PrintToScreen();
void WriteToDatabase();
void OrWhatever();
};
Output x;
Data match = findoneresult();
x.push_back(findoneresult());
x.PrintToScreen();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句