在类中传递引用给其他类时出现编译错误求助
Arduino编译错误:无法匹配ZenSpeakerGroup构造函数参数
初始可运行代码
主程序代码
Diablo_Serial_4DLib Display(&DisplaySerial); ZenDisplay ui(Display);
ZenDisplay类定义
class ZenDisplay { public: ZenDisplay(Diablo_Serial_4DLib &display); void setup(); private: Diablo_Serial_4DLib* _display; };
ZenDisplay构造函数实现
// Constructor ///////////////////////////////////////////////////////////////// ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display) { _display = &display; }
新增ZenSpeakerGroup类后的代码
ZenSpeakerGroup类定义
class ZenSpeakerGroup { public: ZenSpeakerGroup(Diablo_Serial_4DLib &display); private: Diablo_Serial_4DLib* _display; };
ZenSpeakerGroup构造函数实现
ZenSpeakerGroup::ZenSpeakerGroup(Diablo_Serial_4DLib &display) { _display = &display; }
修改ZenDisplay后的代码
修改后的ZenDisplay类定义
class ZenDisplay { public: ZenDisplay(Diablo_Serial_4DLib &display); void setup(); private: Diablo_Serial_4DLib* _display; ZenSpeakerGroup _speakerGroup; };
修改后的ZenDisplay构造函数
// Constructor ///////////////////////////////////////////////////////////////// ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display) : _speakerGroup(&display) { _display = &display; }
编译错误信息
Arduino: 1.8.16 (Mac OS X), Board: "DOIT ESP32 DEVKIT V1, 80MHz, 921600, None" /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenDisplay.cpp: In constructor 'ZenDisplay::ZenDisplay(Diablo_Serial_4DLib&)': /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenDisplay.cpp:14:78: error: no matching function for call to 'ZenSpeakerGroup::ZenSpeakerGroup(Diablo_Serial_4DLib*)' ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display) : _speakerGroup(&display) ^ In file included from /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenDisplay.h:14, from /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenDisplay.cpp:9: /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:18:5: note: candidate: 'ZenSpeakerGroup::ZenSpeakerGroup(Diablo_Serial_4DLib&)' ZenSpeakerGroup(Diablo_Serial_4DLib &display); ^~~~~~~~~~~~~~~ /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:18:5: note: no known conversion for argument 1 from 'Diablo_Serial_4DLib*' to 'Diablo_Serial_4DLib&' /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:15:7: note: candidate: 'constexpr ZenSpeakerGroup::ZenSpeakerGroup(const ZenSpeakerGroup&)' class ZenSpeakerGroup ^~~~~~~~~~~~~~~ /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:15:7: note: no known conversion for argument 1 from 'Diablo_Serial_4DLib*' to 'const ZenSpeakerGroup&' /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:15:7: note: candidate: 'constexpr ZenSpeakerGroup::ZenSpeakerGroup(ZenSpeakerGroup&&)' /Users/xxx/Documents/Arduino/libraries/ZenOne/ZenSpeakerGroup.h:15:7: note: no known conversion for argument 1 from 'Diablo_Serial_4DLib*' to 'ZenSpeakerGroup&&' exit status 1 Error compiling for board DOIT ESP32 DEVKIT V1. This report would have more information with "Show verbose output during compilation" option enabled in File -> Preferences.
尝试过的无效方法
使用_speakerGroup = new ZenSpeakerGroup(&display)赋值,编译依然失败。
解决方案
错误核心原因
初始化_speakerGroup时传入了指针&display,但ZenSpeakerGroup的构造函数要求的是引用类型(Diablo_Serial_4DLib &display),指针与引用无法直接隐式转换,因此编译器找不到匹配的构造函数。另外,_speakerGroup是栈上对象实例,不是指针类型,不能直接用new赋值。
修复方案1:直接传入引用(推荐)
修改ZenDisplay的构造函数初始化列表,直接传入display(本身就是引用):
ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display) : _speakerGroup(display) { _display = &display; }
此方式完全匹配构造函数参数要求,可直接通过编译。
修复方案2:改为指针管理(可选)
如果需要动态分配ZenSpeakerGroup,可将其声明为指针类型:
- 修改
ZenDisplay类定义:
class ZenDisplay { public: ZenDisplay(Diablo_Serial_4DLib &display); ~ZenDisplay(); // 添加析构函数释放内存 void setup(); private: Diablo_Serial_4DLib* _display; ZenSpeakerGroup* _speakerGroup; // 改为指针类型 };
- 实现构造函数与析构函数:
ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display) { _display = &display; _speakerGroup = new ZenSpeakerGroup(display); // 传入引用而非指针 } ZenDisplay::~ZenDisplay() { delete _speakerGroup; // 释放动态内存,避免泄漏 }
此方式需注意内存管理,必须在析构函数中释放对象。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

