gpt4 book ai didi

c++ - 将 unique_ptr 的 vector 传递给对象。 vector 成为成员变量。正确的做法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:40 24 4
gpt4 key购买 nike

我将称之为“所有者”的一个对象在其生命周期内拥有数据对象 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/

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