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

标签 c++ oop c++11

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

相关文章:

c++ - 通过 std::transform 将 std::map 展平为一个集合

c++ - 按 map 类型获取元素的 map 的编译错误元组

c++ - 为什么我们应该为这段代码使用指针?

c++ - 如何计算帧缓冲区间距?

c++ - 静态函数的意外行为

c++ - x86-64 movl 和 cmpl 区别

c++ - OpenCV Flann - 断言失败

java - 如何使构造函数仅对工厂类可用?

python - 如何在 pygame 中连续生成并跟踪多个具有时间延迟的随机对象?

c# - list 上应该包含哪些内容可以帮助开发优秀的 OO 软件?