我将称之为“所有者”的一个对象在其生命周期内拥有数据对象 vector 的明确所有权。
这些存储为 unique_ptr 的 vector 。
一个对象/类,称为“Output”,需要在许多不同的方法中查看这些数据对象,因此某种引用/指针/变量是“Output”的成员变量.
Output 在其构造函数中接收数据对象的 vector 。
我想到了三种方法来实现这一点。最好的方法是什么?
选项 1 - “输出”对象将数据 vec 存储为常量引用:
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 存储为常量指针:
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 中是否清楚输出没有数据的所有权,即使它存储为 unique_ptrs? 选项 3 在调用站点是否困惑?需要多 3 行才能达到相同的结果。
此处的最佳做法是什么?
最佳答案
如果您只需要“读取一些值,然后 [创建] 各种输出文件”,我只会将其设为一个由 const-ref 获取的函数:
void output(std::vector<std::unique_ptr<Data>> const& data) {
// stuff
}
我更喜欢 const&
至 const*
对于使用语义( data[0]
vs (*data)[0]
),绝对更喜欢两者都传递原始数据——不要无缘无故地放弃你的明确所有权(在这种情况下,它甚至不是为了方便,因为它很烦人构造一个 vector<Data*>
无论如何)
关于c++ - 将 unique_ptr 的 vector 传递给对象。 vector 成为成员变量。正确的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26800889/