将 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&lt;info*&gt; vect_node[3];会创建一个包含3个vectors的数组,就像int my_array[3];声明一个包含3个ints的数组一样。 这个vect_node[1].lux[0] = 25; 是错误的 如果你想使用 std::vector 的构造函数你必须做 (3)。但是你的指针仍然会被统一化 @Michoumichmich 那我该怎么做呢?是 vect_node[1]->lux[0]=20``? 有了std::vector&lt;info&gt; vect_node(3),你只需要vect_node[0].lux[0]=25,它就变了,是的^^ 【参考方案1】:

语法std::vector&lt;info*&gt; vect_node[3]; 将创建一个包含3 个std::vectors 的数组,就像int my_array[3]; 声明一个包含3 个ints 的数组一样。

如果您想创建一个初始容量为 3 的 std::vector,请使用填充构造函数。例如,

std::vector<info*> vect_node3, nullptr;

将构造一个名为vect_nodestd::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)之外,它还可以通过-&gt; operator 访问。 如果我这样做std::vector&lt;info&gt; vect_node3, nullptr?是否正确,我可以像这样访问 ``` vect_node[1].lux[0]=20```? 对于std::vector&lt;info&gt; vect_node3, nullptr,您不使用 nullptr,因为您没有指针。只需std::vector&lt;info&gt; vect_node(3),您的访问方式将是正确的 std::vector 隐式调用类的构造函数【参考方案2】:

轻松初始化指针向量的一种方法是使用智能指针,因此您可以在一行中执行以下操作:

std::vector<std::shared_ptr<info>> vect_node(3, std::make_shared<info>());

这将创建一个包含三个智能指针的向量并分配内存。然后,您将能够丢弃向量而不必担心。您可以使用vect_node[O]-&gt;lux[0] = 10;修改元素

你只需要为你的类info创建一个构造函数。

【讨论】:

以上是关于将 std::vector 与类一起使用时的 C++ 读写问题的主要内容,如果未能解决你的问题,请参考以下文章

将 std::vector 与结构一起使用时出现不完整的类型错误

OpenGL:将 VBO 与 std::vector 一起使用

运行时错误:将 .push_back() 与 std::vector 一起使用时访问冲突?

c++11 std::array vs 静态数组 vs std::vector

C++ 动态分配的 std::vector

std::vector 在清除或删除 POD 时的行为是不是不同