我一般都是c ++的新手。因此,在最近帮助使用Arduino类型项目读取RFID标签后,我一直在努力学习使用矢量。它真的让我觉得我不知道如何编程。所以我打了书!
所以这是一个问题:当我执行以下代码时:
#include <iostream>
#include <vector>
struct Runner{
char runnerTag[32];
uint32_t ts;
};
std::vector<Runner > runners;
int main() {
std::cout << "Hello, Runners!\n";
for (int i = 0; i < 100; i++) {
std::string runnertg = "testTrackTag01";
uint32_t timeStamp = rand() % 100 + 1;
runners[i] = new Runner({runnertg, timeStamp});
}
return 0;
}
我从xcode收到了这个恼人的小消息:
No matching constructor for initialization of 'Runner'
在上面代码段的第16行。世界上我做错了什么?
答案 0 :(得分:3)
表达式new Runner({runnertg, timeStamp})
的类型不匹配。 runnertg
的类型为std::string
,而元素Runner::runnerTag
的类型为char[32]
。
表达式runners[i] = new Runner({runnertg, timeStamp});
有另一种类型不匹配。 runners
的元素类型为Runner
,而new Runner({runnertg, timeStamp})
表达式的类型为Runner*
。
runners[i]
是超出范围的访问权限。 runners
的大小为0. runners[i]
的所有值的元素i
都不存在。
由于所有代码路径的每个delete
都没有匹配new
,因此存在内存泄漏。
请勿使用rand()
。
答案 1 :(得分:3)
你正在使用的许多代码都是旧样式C,其中包含一些C ++ STL代码。我将尝试解决一些问题。
struct
是一种抽象数据类型(通常用于组织原始数据类型)。虽然struct
和class
之间的唯一区别是后者默认所有成员都是私有的,在这种情况下不起作用,但在通过时削减这些内容是件好事。
其次,char
的数组很麻烦,很乱,容易出错。请改为std::string
。
最后,让我们创建一个带有两个参数的构造函数。
因此:
#include <string>
class Runner {
public:
std::string runnerTag;
uint32_t ts;
Runner(std::string, uint32_t);
};
接下来的事情。使用数组索引操作符[]
来访问或修改std::vector
是危险的,并且无法使用容器及其随附的所有精彩功能。
既然你知道for循环,那就试试吧:
for (int i = 0; i < 100; i++) {
std::string runnertg = "testTrackTag01";
uint32_t timeStamp = rand() % 100 + 1;
Runner Runner(runnertg, timeStamp);
runners.push_back(Runner);
}
在代码的最后,在main函数的范围之外,按如下方式定义构造函数:
Runner::Runner(std::string rt, uint32_t ts) {
runnerTag = rt;
ts = ts;
}
这应该让你开始。
答案 2 :(得分:0)
您无法将std::string
转换为char
数组。将成员变量runnerTag
的类型更改为std::string
。此外,您正在访问不存在的矢量元素。使用resize
创建它们。或者更好的是,使用emplace_back
同时执行这两项操作。另外,请勿使用int
来迭代容器,但std::size_t
。另外,请不要使用rand()
,而应使用<random>
标题中的类。使用%的技巧会产生不均匀的分布。