Почему мои значения в члене класса карты C ++ стираются? - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 2 класса: InuReading и InuTask.Выглядит так:

Заголовок InuReading:

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);

};

Метод InuReading:

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());
}

Main:

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

Сразу после того, как данные установлены на карте, у них есть 1 элемент, но как только я получаю InuReading из вектора, его свойство данных становится пустым.Как мне получить данные, которые нужно вставить в карту?

1 Ответ

0 голосов
/ 23 мая 2018

newReading возвращает значение InuReading по значению, что означает, что r в addTemperatureReading является локальным объектом и не имеет никакого отношения к объектам, сохраненным в векторе 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());
}

Обратите внимание, что это изменение также требует, чтобы вы возвращали ссылку в вектор readings из newReading:

InuReading& InuTask::newReading(String t, String l){
    readings.push_back(InuReading(t, l);
    return readings.back();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...