所以我来自试图用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,就好像它正在查看新对象或其他东西一样。我在这里想念什么?为什么字段的值不能在循环中的循环之间持久存在于对象上?

最佳答案

Lane lane = lanes[i];

复制lanes[i]-对lane的任何修改均不会影响该元素。尝试reference:
Lane &lane = lanes[i];
lanelanes[i]的别名。使用lane就像使用lanes[i]一样,通过分配给lane.winningOrder,您实际上将分配给引用的lanes[i]winningOrder。没有副本。

也开始使用member initialization lists代替成员函数的赋值和const限定词。

09-15 11:52