如何生成数据以及如何传递数据

how to generate data and how to pass it over?

本文关键字:数据 何传递 何生成      更新时间:2023-10-16

假设我需要创建一个缓冲区或者一个对象向量或者其他什么

,这些数据需要提供给对象构造函数…

在像这样的类函数中生成数据是否常见?
class A
{
    void gen()
    {
        vector<Data*> v;
        obj= new Obj(&v);
    }
}

class Obj
{
private:
    vector<Data*> *data;
public:
    Obj(vector<Data*> *v)
    {
        data=v;
    }
}

好主意吗?坏主意?

背景问题是我是否使用指针,引用…作为我函数的入口和输出;构造函数,何时以及出于什么原因…

谢谢

特别是,这是一个非常坏主意:

{
    vector<Data*> v;
    obj= new Obj(&v); // 1: pass address of v
}                     // 2: v gets destroyed (obj will hold the address of
                      //    an out-of-scope variable) and application will
                      //    probably crash when it attempts to use it.

我使用指针,引用…作为我函数的入口和输出;构造函数,何时以及出于什么原因…

那是一个…广泛的主题。一般来说,您应该:

  • 直接使用对象,在作用域中声明对象(按值)。
  • 通过const引用传递对象,当传入的函数只需要只读访问时。
  • 在函数改变对象时通过非const引用传递对象
  • 如果你需要一个对象在你创建它的范围之外,如果可能的话,按值返回,否则使用指针(参见下面的"避免原始指针")

避免原始指针:

  • 原始指针(T*)应该是:

    • 被std::unique_ptr替换,当指针只存在一个所有者时(当指针在一个地方使用时)
    • 替换为std::shared_ptr,当所有权是共享的,有多个所有者,或者指针没有明确的所有者。
    • 当您需要一个任意长度的值数组
  • 时,将
  • 替换为std::vector
  • 当你需要n个值的数组

  • 时用std::array代替
  • 唯一使用原始指针的地方是:

  • 当你对指针值本身感兴趣时(例如,记录分配的地址,跟踪内存,编写分配器或对象池,实现迭代器类型)

在你的特殊情况下:

class Obj
{
private:
    vector<Data*> data; // store by value
public:
    Obj(vector<Data*> v) // pass by value (creates a copy of the data)
    : data{ std::move(v) } // move passed value into internal member
    {
    } 
};
class A
{
    Obj gen()                     // return obj by value
    {
        vector<Data*> v;          // allocate by value
        Obj obj{ std::move(v) };  // move v into obj
        return obj;               // return by value
    }
};