You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Thermostat类调用DHT库报错:_dht无类类型问题求助

解决Arduino Thermostat类中DHT实例的报错问题

我来帮你搞定这个DHT类初始化的问题——你遇到的报错'((Thermostat*)this)->Thermostat::_dht' does not have class type,核心原因是你在类的私有成员里错误地声明了_dht,把它写成了函数而不是对象。咱们一步步修正:

错误根源分析

你在Thermostat.h的私有部分写了:

DHT _dht(uint8_t, uint8_t);

这行代码在C++里会被编译器解读为声明一个返回DHT类型的成员函数,而不是声明一个DHT类的对象成员。所以当你在DHTstart()里调用_dht.begin()时,编译器会认为_dht是个函数,自然会报错说它“没有类类型”。

修正后的代码

下面是修正后的完整Thermostat.h代码:

/* Thermostat.h - Library for smart thermostat */
#ifndef Thermostat_h
#define Thermostat_h
#include "Arduino.h"
#include <DHT.h>

class Thermostat {
public:
  Thermostat();
  void DHTstart();
private:
  // 正确声明DHT类型的成员对象,不要加参数(那会变成函数声明)
  DHT _dht; 
};

// 使用构造函数初始化列表来初始化_dht对象
Thermostat::Thermostat() : _dht(7, DHT22) {
  // 这里不需要额外的初始化代码
}

void Thermostat::DHTstart(){
  _dht.begin();
}

#endif

关键修正点

  • 私有成员声明:把原来的函数声明改成单纯的对象声明DHT _dht;,明确告诉编译器这是一个DHT类的实例。
  • 构造函数初始化:用C++的初始化列表(: _dht(7, DHT22))来初始化成员对象,这是初始化类成员对象的标准方式,能确保对象在构造函数体执行前就完成正确初始化。原来的_dht(7,DHT22);写法会被当成函数调用,完全不是初始化对象的正确方式。

可选:更清晰的代码结构(拆分到.cpp文件)

如果你的项目后续会扩展,建议把类的实现代码拆分到单独的.cpp文件里,避免头文件过于臃肿:

Thermostat.h

/* Thermostat.h - Library for smart thermostat */
#ifndef Thermostat_h
#define Thermostat_h
#include "Arduino.h"
#include <DHT.h>

class Thermostat {
public:
  Thermostat();
  void DHTstart();
private:
  DHT _dht; 
};

#endif

Thermostat.cpp

#include "Thermostat.h"

Thermostat::Thermostat() : _dht(7, DHT22) {
}

void Thermostat::DHTstart(){
  _dht.begin();
}

这样修改后,你的主sketch代码不需要做任何改动,就能正常编译运行了。

内容的提问来源于stack exchange,提问作者otmezger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:24