【发布时间】:2015-01-04 05:22:22
【问题描述】:
我将称为“所有者”的一个对象在其生命周期内具有数据对象向量的明确所有权。
这些存储为 unique_ptr 的向量。
一个对象/类,称为“Output”,需要以多种不同的方法查看这些数据对象,因此某种的引用/指针/变量是“Output”的成员变量.
输出在其构造函数中接收数据对象的向量。
我想了三种方法来实现这一点。什么被认为是最好的方法?
选项 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 中是否清楚输出没有数据的所有权,即使它存储为 unique_ptrs? 选项 3 在呼叫现场是否混乱?需要多 3 行才能达到相同的结果。
这里的最佳做法是什么?
【问题讨论】:
-
如有疑问,请使用 shared_ptr
-
我个人喜欢
const&,不要使用std::transform。但这可能取决于Output对数据的处理方式。 -
@Barry 在我的现实生活中,Output 只是读取一些值,然后创建各种输出文件。不修改数据。
-
@NeilKirk 问题是我一直在阅读 shared_ptr 不应该在没有终身共享时使用。我知道调用“输出”对象的对象是整个程序生命周期的所有者。
-
@NeilKirk:强烈反对。过度使用 shared_ptr 是一种瘟疫,应该避免。如有疑问,请使用 unique_ptr。