将 std::vector 与类一起使用时的 C++ 读写问题
Posted
技术标签:
【中文标题】将 std::vector 与类一起使用时的 C++ 读写问题【英文标题】:C++ reading and writing problems in using std::vector with classes 【发布时间】:2021-01-09 23:58:55 【问题描述】:我在 hpp 文件中有这个类:
class info
public:
float lux[100];
float pwm[100];
float time[100];
float ref_lux;
int counter_samples_stream;
;
在包含这个头文件的 cpp 文件中,我创建了这个类的一个向量,因为我把它放在 cpp 文件的开头,所以它是一个全局变量。这是我用来创建它的代码:
std::vector <info*> vect_node[3]; //creates 3 instances of class info in a vector
在函数(称为 abc)内部,我们通过执行以下示例来更改和初始化向量的数据: vect_node[1].lux[0] = 25;
。
我们还尝试在另一个函数(称为 zys)中访问向量的数据,但是当尝试访问它时程序崩溃并返回核心转储。
函数 abc 或 zys 都不会在其参数中传递 vect_node。问题是我如何在函数中写入vec_node
,以使其永久更改其值(不仅在函数中)并从现在在另一个函数(syz)中更新的这个向量中读取。
【问题讨论】:
我相信语法std::vector<info*> vect_node[3];
会创建一个包含3个vector
s的数组,就像int my_array[3];
声明一个包含3个int
s的数组一样。
这个vect_node[1].lux[0] = 25;
是错误的
如果你想使用 std::vector 的构造函数你必须做 (3)。但是你的指针仍然会被统一化
@Michoumichmich 那我该怎么做呢?是 vect_node[1]->lux[0]=20``?
有了std::vector<info> vect_node(3)
,你只需要vect_node[0].lux[0]=25
,它就变了,是的^^
【参考方案1】:
语法std::vector<info*> vect_node[3];
将创建一个包含3 个std::vector
s 的数组,就像int my_array[3];
声明一个包含3 个int
s 的数组一样。
如果您想创建一个初始容量为 3 的 std::vector
,请使用填充构造函数。例如,
std::vector<info*> vect_node3, nullptr;
将构造一个名为vect_node
的std::vector
,其初始容量为3,其中向量中的每个元素都是info*
类型,其初始值为nullptr
。
正如 cmets 中所指出的,如果您不想要指针向量,则可以改用
std::vector<info> vect_node3;
在这种情况下,将创建一个大小为 3 的 std::vector
,称为 vect_node
。向量的每个元素都将包含一个info
对象。使用这种方法,您的
vect_node[1].lux[0] = 25;
现在将有效。
std::vector
构造函数的文档可以在 here 找到。
【讨论】:
还应该澄清vector
类型是info
指针不是info
,所以vect_node[1].lux[0] = 25;
会导致reading access violation
。除了需要初始化元素(在本例中为new
)之外,它还可以通过-> operator
访问。
如果我这样做std::vector<info> vect_node3, nullptr
?是否正确,我可以像这样访问 ``` vect_node[1].lux[0]=20```?
对于std::vector<info> vect_node3, nullptr
,您不使用 nullptr,因为您没有指针。只需std::vector<info> vect_node(3)
,您的访问方式将是正确的
std::vector 隐式调用类的构造函数【参考方案2】:
轻松初始化指针向量的一种方法是使用智能指针,因此您可以在一行中执行以下操作:
std::vector<std::shared_ptr<info>> vect_node(3, std::make_shared<info>());
这将创建一个包含三个智能指针的向量并分配内存。然后,您将能够丢弃向量而不必担心。您可以使用vect_node[O]->lux[0] = 10;
修改元素
你只需要为你的类info
创建一个构造函数。
【讨论】:
以上是关于将 std::vector 与类一起使用时的 C++ 读写问题的主要内容,如果未能解决你的问题,请参考以下文章
将 std::vector 与结构一起使用时出现不完整的类型错误
OpenGL:将 VBO 与 std::vector 一起使用
运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?