如何生成数据以及如何传递数据
how to generate data and how to pass it over?
假设我需要创建一个缓冲区或者一个对象向量或者其他什么
,这些数据需要提供给对象构造函数…
在像这样的类函数中生成数据是否常见?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
}
};
相关文章:
- 如何将结构数据成员传递到函数中
- 将自定义 Java 数据模型传递给我的本机代码
- 我将 c++ 矢量数据集转换为 c 数组.我将相同的数据集传递到一个应该给出相同输出的函数中
- 返回int数据类型v/s传递参考
- 无法将 const 数据类型传递到非 const 函数中
- 如何使程序将数据正确传递到数组?(家庭作业)
- 将指针作为私有数据成员传递到 Main 中的成员函数中
- 将任意的JavaScript数据对象传递到Node.js C 插件
- 将原始数据类型传递到C 中的函数
- 将二维数组从数据文件传递给函数并输出内容
- 使用固定指针将大型数据结构传递给非托管代码
- 将数据从 C++ 传递到 C# 的最有效方法
- 在高性能计算中更好的做法是:将数据结构传递到一个函数或一组变量中
- 如何将数据从 C# 传递到 C++(只是指针,没有封送)
- 将只读数据安全地传递到新线程
- 通过LevelDB将协议缓冲区序列化数据从C++传递到Python
- 如何收集数据并传递数据
- 面向组件系统中的灵活数据消息传递
- 将数据从c++传递到c#
- 数组数据在传递指针C后损坏