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

在类中传递引用给其他类时出现编译错误求助

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,可将其声明为指针类型:

  1. 修改ZenDisplay类定义:
class ZenDisplay
{
  public:
    ZenDisplay(Diablo_Serial_4DLib &display);
    ~ZenDisplay(); // 添加析构函数释放内存
    void setup();
  private:
    Diablo_Serial_4DLib* _display;
    ZenSpeakerGroup* _speakerGroup; // 改为指针类型
};
  1. 实现构造函数与析构函数:
ZenDisplay::ZenDisplay(Diablo_Serial_4DLib &display)
{
    _display = &display;
    _speakerGroup = new ZenSpeakerGroup(display); // 传入引用而非指针
}

ZenDisplay::~ZenDisplay()
{
    delete _speakerGroup; // 释放动态内存,避免泄漏
}

此方式需注意内存管理,必须在析构函数中释放对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:25:09