为什么擦除C++映射类成员中的值?

Why are my values in a C++ map class member wiped?

本文关键字:成员 擦除 C++ 映射 为什么      更新时间:2023-10-16

我有2个类:InuReadingInuTask。看起来像这样:

犬读标题:

class InuReading{
public:
InuReading(String t, String l){
type = t;
label = l;
};
String type;
String label;
std::map<String, String> data;
void set(String key, float d);
};

InuTask 标头:

class InuTask{
public:
InuTask(String);
String type;
void addTemperatureReading(String sensor, float temperature);
std::vector<InuReading> readings;
private:
InuReading newReading(String t, String l);
};

犬读法:

void InuReading::set(String key, float d){
data[key] = String(d); 
};

InuTask方法:

InuTask::InuTask(String t){
type = t;
}
InuReading InuTask::newReading(String t, String l){
InuReading r(t, l);
readings.push_back(r);
return r;
}
void InuTask::addTemperatureReading(String sensor, float temperature){
InuReading r = newReading("temperature", sensor);
r.set("d", temperature);
// Size here after setting "d" to 30.0 is 1, which is proper
Serial.printf("Size of %s is now: %i n", r.type.c_str(), r.data.size());
}

主要:

InuTask task("Log");
task.addTemperatureReading("Temperature", 30);
// This returns 0, all data is missing now?
Serial.println(task.readings[0].data.size());

在地图上设置数据后,它立即具有 1 个元素,但是一旦我从向量中获取 InuReading,它的数据属性就是空的。如何让数据保留在地图上?

newReading按值返回InuReading,这意味着addTemperatureReading中的r是本地对象,与存储在任务readings向量中的对象没有任何关系。

您可能希望newReading返回引用,并将addTemperatureReading更改为使用引用:

void InuTask::addTemperatureReading(String sensor, float temperature){
InuReading &r = newReading("temperature", sensor);
r.set("d", temperature);
// Size here after setting "d" to 30.0 is 1, which is proper
Serial.printf("Size of %s is now: %i n", r.type.c_str(), r.data.size());
}

请注意,此更改还要求您从newReading返回对readings向量的引用:

InuReading& InuTask::newReading(String t, String l){
readings.push_back(InuReading(t, l);
return readings.back();
}