具有不同构造函数参数的CPP对象数组

时间:2019-04-17 12:02:31

标签: c++ arrays oop object

我有8个AM2301传感器,可以使用this DHT library进行单独读取,并且示例代码已根据我的要求进行了修改。这意味着必须对每个传感器执行类似的操作(这会导致很多重复代码)。

DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t,h;
t = dht.readTemperature();
h = dht.readHumidity();

现在,我正在尝试重构代码,以便拥有一个DHT对象数组,可以对其进行迭代以声明,初始化和读取(从float数组中)值。

stackoverflow上检查了一些线程后,等等。我想出了两个版本的代码。

这是我代码的相关部分。整个源(基于PlatformIO)为uploaded here

    SERIAL.print("Reading sensors: ");
    uint32_t startTime = millis();

    uint8_t SENSORS[] =  { PIN_SENSOR0, PIN_SENSOR1, PIN_SENSOR2, PIN_SENSOR3,
                           PIN_SENSOR4, PIN_SENSOR5, PIN_SENSOR6, PIN_SENSOR7 };

    SERIAL.println("INIT SENSORS");

    /* Please disregard this snippet. 
    // I was trying various things before posting here and messed up.
    DHT am2301[8];
    uint8_t i;
    for (i=0; i<8; i++){
      *am2301[i] = DHT(SENSORS[i], DHT_TYPE);
      am2301[i]->begin();
    }
    */

    // This locks up
    DHT **am2301;
    am2301 = new DHT* [8];
    uint8_t i;
    for (i=0; i<8; i++){
      am2301[i] = new DHT(SENSORS[i], DHT_TYPE);
      am2301[i]->begin();
    }

但是,这两种样式仅在打印“ INIT SENSORS”(INIT传感器)之后就锁定了代码执行。目标平台是ATSAMD21。

我不是专业的C / C ++程序员,所以这里可能有我遗漏或忽略的内容。我需要一些帮助,以弄清自己在做错什么,以及是否有更好的方法可以做到这一点。

编辑:按照接受的答案中的建议使用vector,我可以得到一个可迭代的对象列表。但是,该程序仍然锁定。似乎此特定问题与DHT库不喜欢多个动态对象有关。现在到github ...

1 个答案:

答案 0 :(得分:1)

c ++为您提供了大量的对象存储类型,以帮助您完成这类事情。看到DHT **am2301;通常可以用std::vector之类的东西代替,RAII被设计为对象的向量。假设您已经说过:

DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float t = dht.readTemperature();

正常工作,那么您可以轻松地生成这些读数类型的向量,如下所示:

std::vector<DHT> am2301; // My vector
for (auto i = 0; i < 8; ++i) {
    am2301.emplace_back(SENSORS[i], DHT_TYPE); // Create the objects in place with the 
                                               // correct constructor arguments. std::vector
                                               // takes care of memory allocation.
    am2301[i].begin(); // Start the object
}

float t = am2301[5].readTemperature(); // Use the vector

这省去了以后记住删除对象的麻烦,并为您提供了更多使用该矢量的灵活性。像这样的类型的使用是c ++ pandas.Series.astype中最强大的功能之一。

相关问题