2016-02-27 66 views
1

所以我來自C#詞,試圖用C++編程我的粒子光子。我試圖利用一個班級來幫助更好地組織數據。對象上的C++字段值未被保留

我做了一個叫巷類的定義:

#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文件中,粒子執行循環,我從中讀取並設置了我的字段。通過循環預先設定的調試值返回0和設定值後返回1的預期(我稍微濃縮此文件,以使其更易於閱讀。)

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

    } 
} 

第一次。下一次通過循環它進入if語句爭議!lane.hasFinished()。預設返回0,就好像它正在查看一個新對象或其他東西一樣。我在這裏錯過了什麼?爲什麼該字段的值不會保留在循環中循環之間的對象上?

回答

1
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限定符的成員函數。

1

因爲您每次都在創建一個新對象。

Lane lane = lanes[i]; 

這將創建Lane類被稱爲「車道」,其內容是拷貝構造從lanes[i]的新實例。

然後,該循環的其餘部分與此lane對象一起使用。它會根據需要旋轉內容,之後這個對象被破壞。

通過循環的下一次,您可以製作同一個尚未使用的對象的另一個副本。

將其更改爲參考應該會得到您想要的行爲。

Lane &lane = lanes[i];