2016-02-27 5 views
1

Итак, я исхожу из слова C#, которое пытается запрограммировать мой фотоснимк на C++. Я пытаюсь использовать класс, чтобы лучше упорядочить данные.Значение поля C++ для объекта не сохраняется

Я сделал определение класса под названием Lane:

#ifndef Lane_h 
#define Lane_h 
#include "application.h" 

class Lane { 

public: 

    Lane(int sensorId, String laneName); 
    Lane(); 

    int 
    readSensor(void), 
    getWinningOrder(void); 

    bool 
    hasFinished(void); 

    void 
    setWinningOrder(int order); 

    String 
    getName(); 

    int 
    winningOrder; 


private: 
    int 
     sensor; 

    String 
     name; 

}; 

#endif 

Тогда я сделал файл CPP:

#include "Lane.h" 
#include "application.h" 

Lane::Lane(int sensorId, String laneName){ 
    sensor = sensorId; 
    name = laneName; 
    winningOrder = 0; 
} 

Lane::Lane(){ 
    winningOrder = 0; 
} 

int Lane::readSensor(){ 
    int value = analogRead(sensor); 
    return value; 
} 

String Lane::getName(){ 
    return name; 
} 

bool Lane::hasFinished(void){ 
    Particle.publish("DEBUG", name + " has a winning order of: " + String(winningOrder)); 
    return winningOrder != 0; 
} 

До сих пор так хорошо.

Теперь в моем файле .ino, который Particle выполняет цикл, в котором я читаю и устанавливаю свое поле. (Я немного конденсируется этот файл, чтобы сделать его более удобным для чтения.)

// This #include statement was automatically added by the Particle IDE. 
#include "Lane.h" 

Lane lanes[] = { 
    Lane(A5, "Lane 1"), 
    Lane(A4, "Lane 2"), 
    Lane(A3, "Lane 3"), 
    Lane(A2, "Lane 4") 
    }; 
int winningPlace = 1; 

void setup() { 

} 

void loop() { 
    for (uint32_t i = 0; i < arraySize(lanes); i++) { 
     Lane lane = lanes[i]; 
     int value = lane.readSensor(); 

     if(value + sensitivity < initalValues[i] && !lane.hasFinished()){ 
      Particle.publish("DEBUG", lane.getName() + " pre-set field value is " + lane.winningOrder); 
      lane.winningOrder = winningPlace++; 
      Particle.publish("DEBUG", lane.getName() + " set field value is " + lane.winningOrder); 
     } 

    } 
} 

Первый раз через петлю заранее установленное значение отладки возвращает 0 и после заданного значения возвращается 1, как и ожидалось. В следующий раз через цикл он войдет в аргумент if: lane.hasFinished(). Предварительно установленный возвращает 0, как если бы он смотрел на новый объект или что-то в этом роде. Что мне здесь не хватает? Почему значение поля не сохраняется на объекте между циклами в цикле?

ответ

1
Lane lane = lanes[i]; 

делает копию lanes[i] - любая модификация lane не будет влиять на элемент. Попробуйте reference:

Lane &lane = lanes[i]; 

lane является псевдонимом для lanes[i]. Используя lane, вы используете lanes[i] и назначая lane.winningOrder, вы фактически назначаете lanes[i]winningOrder. Нет копий.

Также следует использовать member initialization lists вместо назначений и const квалификаторы для функций-членов.

1

Потому что вы каждый раз создаете новый объект.

Lane lane = lanes[i]; 

Это создает новый экземпляр класса Lane под названием «переулком», содержание которого является копией возведенной из lanes[i].

Затем остальная часть петли работает с этим объектом lane. При необходимости содержимое становится скрученным, и впоследствии этот объект уничтожается.

В следующий раз через цикл вы создадите еще одну копию того же неиспользуемого объекта.

Изменение его в качестве ссылки должно привести к желаемому поведению.

Lane &lane = lanes[i]; 
Смежные вопросы