首页 > 解决方案 > 具有不同构造函数参数的 CPP 对象数组

问题描述

我有 8 个 AM2301 传感器,我可以使用这个 DHT 库单独读取它们,并将示例代码修改为我的要求。这意味着必须为每个传感器执行类似的操作(这会导致大量重复代码)。

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

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

在检查了stackoverflow上的一些线程等之后,我想出了两个可以编译的代码版本。

这是我的代码的相关部分。整个源代码(基于 PlatformIO)在此处上传

    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”之后锁定代码执行。目标平台是 ATSAMD21。

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

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

标签: c++arraysoopobject

解决方案


c++ 为您提供了大量的对象存储类型来帮助您处理这些事情。SeeingDHT **am2301;通常可以用类似 a 的东西来代替,std::vector它被设计为对象的向量。假设你已经说过:

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++ 中最强大的东西之一,RAII


推荐阅读