【问题标题】:CPP object array with DIFFERENT constructor parameters具有不同构造函数参数的 CPP 对象数组
【发布时间】:2019-09-07 16:14:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 请忽略带有am2301[i]-&gt;begin(); 的sn-p。在将其发布到此处之前,我正在尝试一些不同的东西,结果搞砸了。在这一点上,我只想要一个 DHT 数组,我可以使用 (PIN_SENSORx, DHT_TYPE) 和 begin() 来初始化并从中读取。

标签: c++ arrays oop object


【解决方案1】:

c++ 为您提供了大量的对象存储类型来帮助您处理这些事情。看到DHT **am2301; 通常可以替换为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

【讨论】:

  • 谢谢。我试过这个,得到一个关于找不到矢量的错误,所以包含 。现在我有一堆错误...... Pastebin:pastebin.com/t8HBtjyL
  • @Pranav,您应该打开另一个问题来解决这些问题。从您在此处发布的错误和您问题中的代码来看,无法知道为什么会发生这种情况。
  • 好的。非常感谢。我学到了一些新东西,现在我正朝着正确的方向前进。
  • 我能够通过取消定义 Arduino 核心使用的最小和最大定义来消除错误。 #undef max#undef min
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多