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
相关产品推荐
相关产品推荐

