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

构造函数需传参的Keypad类作为自定义类成员属性报错解决方案问询

错误根因

你遇到的报错核心原因是Keypad类未提供无参构造函数,当你将Keypad类型作为Keyblock类的成员变量时,编译器会默认生成Keyblock的无参构造函数,该函数会尝试调用成员变量的无参构造函数,而Keypad只有带5个参数的构造函数,因此编译失败。


方案1:使用构造函数+成员初始化列表(推荐)

直接把初始化参数放到Keyblock的构造函数中,在对象构造阶段就完成Keypad和Debug成员的初始化,避免后续赋值操作。
修改后的代码示例:

#include <SPI.h>
#include <Keypad.h>
#include "Debug.h"

class Keyblock {  
  private:
    Debug debug;
    Keypad keypad;
    // 把按键矩阵定义移到类内常量,避免每次初始化重复声明
    static constexpr char keys[4][3] = {
      {'1','2','3'},
      {'4','5','6'},
      {'7','8','9'},
      {'*','0','#'}
    };
  public:
    // 自定义构造函数,用初始化列表初始化所有成员
    Keyblock(byte * keypadRowPins, byte * keypadColPins, Debug &debug)
      : debug(debug), keypad(makeKeymap(keys), keypadRowPins, keypadColPins, 4, 3) {}
    void read();
};


void Keyblock::read() {
  char key = keypad.getKey();
  if (key) { // 建议加判空,避免无按键时打印空字符
    debug.message(key);
  }
}

使用方式:Keyblock myKeyblock(rowPins, colPins, myDebug);


方案2:成员改为指针类型(适合需要保留init两步初始化的场景)

如果你的业务逻辑必须要先声明Keyblock实例,后续再调用init初始化,可以把Keypad成员改为指针类型,初始化时动态创建实例:
修改后的代码示例:

#include <SPI.h>
#include <Keypad.h>
#include "Debug.h"

class Keyblock {  
  private:
    Debug debug;
    Keypad* keypad = nullptr; // 初始化为空指针
    
  public:
    void init(byte * keypadRowPins, byte * keypadColPins, Debug &debug);
    void read();
    // 新增析构函数释放内存
    ~Keyblock() {
      delete keypad;
    }
};


void Keyblock::init(byte * keypadRowPins, byte * keypadColPins, Debug &debug) {
  this->debug = debug;
  char keys[4][3] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
  };
  // 动态创建Keypad实例
  keypad = new Keypad(makeKeymap(keys), keypadRowPins, keypadColPins, 4, 3);
}

void Keyblock::read() {
  if (!keypad) return; // 判空避免未初始化就调用
  char key = keypad->getKey();
  if (key) {
    debug.message(key);
  }
}

使用方式:

Debug myDebug;
Keyblock myKeyblock;
// 后续合适的时机(比如setup函数中)调用初始化
myKeyblock.init(rowPins, colPins, myDebug);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:15:04