不保留对象上的C ++字段值

时间:2016-02-27 16:17:54

标签: 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,就像它正在查看新对象或其他内容一样。我在这里错过了什么?为什么字段的值不会在循环中的循环之间持续存在于对象中?

2 个答案:

答案 0 :(得分:1)

Lane lane = lanes[i];

制作lanes[i]的副本 - 对lane的任何修改都不会影响该元素。试试reference

Lane &lane = lanes[i];

lanelanes[i]的别名。使用lane就好像您使用的是lanes[i],并且通过分配到lane.winningOrder,您实际上会分配给引用的lanes[i]&#39; s {{1 }}。没有副本。

同时开始使用member initialization lists代替成员函数的赋值和winningOrder限定符。

答案 1 :(得分:1)

因为您每次都在创建一个新对象。

Lane lane = lanes[i];

这将创建名为“lane”的Lane类的新实例,其内容由lanes[i]复制构造。

然后,循环的其余部分与此lane对象一起使用。根据需要,它的内容会被弄乱,然​​后,这个对象就会被破坏。

下次循环时,你要制作同一个尚未使用的对象的另一个副本。

将其更改为参考应该得到您想要的行为。

Lane &lane = lanes[i];