Arduino C++类中如何声明带构造参数的其他类实例
在Arduino类中正确初始化带构造参数的类实例
嘿,我来帮你解决这个问题——在自定义类里使用带构造参数的类实例,尤其是用unique_ptr的时候,确实容易踩这些语法坑。让我一步步给你梳理清楚:
问题根源分析
你遇到的两个错误都是因为类成员的初始化方式不正确:
- 头文件里直接给
unique_ptr<LiquidCrystal_I2C>加构造参数:C++不允许在类定义的成员声明中直接用括号传递参数初始化(除非是非常特殊的情况),所以编译器会报错expected identifier before numeric constant。 lcd->begin()的错误:因为你的lcd还没有被正确初始化,是一个空的unique_ptr,调用它的成员函数自然会触发编译错误。
修正后的代码实现
MyClass.h
#ifndef MYCLASS_H #define MYCLASS_H #include <memory> // 必须包含,因为用到了std::unique_ptr和std::make_unique #include <LiquidCrystal_I2C.h> #include <DHT.h> class MyClass { public: MyClass(); // 声明构造函数 boolean initialize(); private: std::unique_ptr<DHT> dht; std::unique_ptr<LiquidCrystal_I2C> lcd; // 只声明,不在这里初始化 }; #endif // MYCLASS_H
MyClass.cpp
#include "MyClass.h" // 构造函数:可以在这里初始化不需要硬件依赖的成员,或者留空 MyClass::MyClass() {} boolean MyClass::initialize() { // 用std::make_unique创建LiquidCrystal_I2C实例,同时传递构造参数 lcd = std::make_unique<LiquidCrystal_I2C>(0x3F, 16, 2); // 可选:检查初始化是否成功(防止内存分配失败) if (!lcd) { return false; } // 现在可以正常调用LCD的begin()方法了 lcd->begin(); // 如果你的DHT模块也需要构造参数,用同样的方式初始化: // dht = std::make_unique<DHT>(你的DHT引脚, DHT传感器类型); // dht->begin(); return true; }
关键知识点
unique_ptr的初始化时机:对于需要构造参数的类,不能在类头文件的成员声明中直接初始化,必须在构造函数或者专门的初始化方法(比如你的initialize())里,用std::make_unique来创建实例并传递参数。- 成员初始化的顺序:如果在构造函数里初始化,记得遵循类成员声明的顺序(不过这里用
initialize()方法更适合Arduino的硬件初始化流程)。 - 空指针检查:使用
unique_ptr时,最好先检查它是否为空(if (!lcd)),避免空指针调用的运行时错误。
内容的提问来源于stack exchange,提问作者Vish K
相关产品推荐
相关产品推荐

