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

虚基类构造器问题:无法实例化TemperatureSensor类

问题解决:无法实例化TemperatureSensor的构造函数问题

错误原因

你的基类Sensor<T>仅提供了带uint8_t address参数的构造函数,未定义默认构造函数。当派生类TemperatureSensor未显式声明构造函数时,编译器会尝试自动生成默认构造函数,但该生成过程需要调用基类的默认构造——而基类不存在默认构造,因此编译器会将派生类的默认构造标记为deleted,导致无参实例化TemperatureSensor sensor;报错。

解决方案

给TemperatureSensor显式定义带地址参数的构造函数,并在其中调用基类的带参构造函数传递地址:

修改后的代码

sensor.h

template<class T>
class Sensor {
    public:
        uint8_t address;
        T data;
        virtual void collectData() = 0;
        Sensor(uint8_t address);
};

class TemperatureSensor: public Sensor<float> {
    public:
        // 添加工有构造函数声明
        TemperatureSensor(uint8_t address);
        void collectData();
};

sensor.cpp

template<typename T>
Sensor<T>::Sensor(uint8_t address) {
    this->address = address;
}

// 实现TemperatureSensor的构造函数,调用基类构造传递地址
TemperatureSensor::TemperatureSensor(uint8_t address) : Sensor<float>(address) {
    // 可添加派生类专属初始化逻辑(如果需要)
}

void TemperatureSensor::collectData() {
    // some code for collecting data
}

主函数调用

// 传入8位地址实例化(注意:0xbeef是16位值,若需要16位地址,需将Sensor类的address类型改为uint16_t)
TemperatureSensor sensor(0xBE); 
Serial.printf("%d", sensor.address);

额外提示

如果你的传感器地址是16位(如你示例中的0xbeef),需要将基类Sensor<T>中的address成员类型从uint8_t改为uint16_t,同时对应修改构造函数参数类型,避免地址截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:25:17