将unique_ptr的向量传递给对象。向量成为成员变量。正确的方法?

风能

我将称为“所有者”的一个对象在其生命周期内对数据对象向量具有明确的所有权。

这些被存储为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行。

什么是最佳做法?

肯尼·奥斯特罗姆(Kenny Ostrom)

由于您使用的是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

向量unique_ptr成员

来自分类Dev

将unique_ptr传递给将其添加到向量的函数

来自分类Dev

在unique_ptr的多维向量中保存的对象的访问方法

来自分类Dev

将unique_ptr传递给函数对象

来自分类Dev

具有unique_ptr成员的对象的错误C2280向量

来自分类Dev

具有unique_ptr成员和自定义析构函数的对象的向量

来自分类Dev

访问unique_ptr向量的迭代器的成员

来自分类Dev

具有向量成员的对象的破坏

来自分类Dev

将向量<unique_ptr <Derived >>移到向量<unique_ptr <Base >>

来自分类Dev

c ++ 11成员函数从unique_ptr的向量返回原始指针的向量

来自分类Dev

无法将向量中的unique_ptr推回

来自分类Dev

如何将unique_ptr从向量<unique_ptr <Foo >>中移出?

来自分类Dev

将局部变量作为向量的成员传递给被调用方

来自分类Dev

将 unique_ptr 传递给对象会引发错误

来自分类Dev

如何将 unique_ptr 对象作为参数传递给作为库的类

来自分类常见问题

如何将std :: unique_ptr传递给函数

来自分类Dev

将unique_ptr容器传递给构造函数?

来自分类Dev

将unique_ptr引用传递给boost :: bind吗?

来自分类Dev

将向量或向量的向量或...的向量(您的想法)传递给函数

来自分类Dev

C ++ 11中unique_ptr的向量

来自分类Dev

如何调整unique_ptr的向量的大小?

来自分类Dev

移动unique_ptr <T>的向量

来自分类Dev

如何排序unique_ptr的向量?

来自分类Dev

具有unique_ptr的结构向量

来自分类Dev

当unique_ptr在向量中时,对std :: unique_ptr <>拥有的对象的引用/ ptr是否安全?

来自分类Dev

将一个unique_ptr向量插入另一个向量

来自分类Dev

将一个unique_ptr向量插入另一个向量

来自分类Dev

C ++传递std :: unique_ptr对象作为函数参数引用的正确方法

来自分类Dev

如何将特征对象传递给向量,该向量在向量的向量中也将具有统一的类型?

Related 相关文章

  1. 1

    向量unique_ptr成员

  2. 2

    将unique_ptr传递给将其添加到向量的函数

  3. 3

    在unique_ptr的多维向量中保存的对象的访问方法

  4. 4

    将unique_ptr传递给函数对象

  5. 5

    具有unique_ptr成员的对象的错误C2280向量

  6. 6

    具有unique_ptr成员和自定义析构函数的对象的向量

  7. 7

    访问unique_ptr向量的迭代器的成员

  8. 8

    具有向量成员的对象的破坏

  9. 9

    将向量<unique_ptr <Derived >>移到向量<unique_ptr <Base >>

  10. 10

    c ++ 11成员函数从unique_ptr的向量返回原始指针的向量

  11. 11

    无法将向量中的unique_ptr推回

  12. 12

    如何将unique_ptr从向量<unique_ptr <Foo >>中移出?

  13. 13

    将局部变量作为向量的成员传递给被调用方

  14. 14

    将 unique_ptr 传递给对象会引发错误

  15. 15

    如何将 unique_ptr 对象作为参数传递给作为库的类

  16. 16

    如何将std :: unique_ptr传递给函数

  17. 17

    将unique_ptr容器传递给构造函数?

  18. 18

    将unique_ptr引用传递给boost :: bind吗?

  19. 19

    将向量或向量的向量或...的向量(您的想法)传递给函数

  20. 20

    C ++ 11中unique_ptr的向量

  21. 21

    如何调整unique_ptr的向量的大小?

  22. 22

    移动unique_ptr <T>的向量

  23. 23

    如何排序unique_ptr的向量?

  24. 24

    具有unique_ptr的结构向量

  25. 25

    当unique_ptr在向量中时,对std :: unique_ptr <>拥有的对象的引用/ ptr是否安全?

  26. 26

    将一个unique_ptr向量插入另一个向量

  27. 27

    将一个unique_ptr向量插入另一个向量

  28. 28

    C ++传递std :: unique_ptr对象作为函数参数引用的正确方法

  29. 29

    如何将特征对象传递给向量,该向量在向量的向量中也将具有统一的类型?

热门标签

归档