C++ 类的 static 成员函数

我用最简单、最直观、和你代码一模一样的场景 ,给你把 static 讲得明明白白!

先记一句话

普通成员 = 属于某个对象(每个传感器自己的) 静态成员 = 属于整个类(大家共用的)


1. 普通成员函数(不带 static)

cpp

运行

复制代码
class SensorSht40 {
    void ReadTask(void *arg); 
};

特点:

  1. 属于某一个传感器对象
  2. 必须通过 sensor->ReadTask() 调用
  3. 自带 this 指针(知道自己是哪个传感器)
  4. 能直接访问私有变量 _temperature

cpp

运行

复制代码
SensorSht40 sensor1;
SensorSht40 sensor2;

sensor1.ReadTask(); // 是 sensor1 的
sensor2.ReadTask(); // 是 sensor2 的

2. 静态成员函数(带 static)

cpp

运行

复制代码
class SensorSht40 {
    static void readTaskWrapper(void *arg);
};

特点:

  1. 不属于任何传感器!属于整个类
  2. 没有 this 指针
  3. 可以直接调用,不需要对象
  4. 能访问私有成员

cpp

运行

复制代码
// 直接用类调用,不需要传感器对象!
SensorSht40::readTaskWrapper(arg);

3. 为什么 FreeRTOS 必须用 static?

FreeRTOS 创建任务要求函数格式必须是:

cpp

运行

复制代码
void (*task_fn)(void *arg);

普通成员函数,编译器会变成:

cpp

运行

复制代码
void ReadTask(SensorSht40* this, void *arg);

❌ 多了一个 this → 格式不匹配 → 报错!

静态函数编译器就是:

cpp

运行

复制代码
void readTaskWrapper(void *arg);

✅ 完全匹配 → 可以创建任务!


4. 最经典的例子(你代码里的用法)

任务包装函数 必须 static

cpp

运行

复制代码
class SensorSht40 {
private:
    float _temperature;

    // 真正的任务(每个传感器自己的)
    void ReadTask(void *arg) {
        while(1) {
            _temperature = read();
            vTaskDelay(1000);
        }
    }

    // 👇 静态包装函数(通用,无this)
    static void readTaskWrapper(void *arg) {
        SensorSht40* sensor = (SensorSht40*)arg;
        sensor->ReadTask(); // 调用真正的任务
    }
};

创建任务

cpp

运行

复制代码
xTaskCreate(readTaskWrapper, ..., this, ...);

流程:

  1. 任务启动 → 调用 readTaskWrapper
  2. 它是 static → 符合 FreeRTOS 要求
  3. 从 arg 拿到传感器对象
  4. 调用真正的 sensor->ReadTask()

5. 静态变量例子(共用数据)

cpp

运行

复制代码
class SensorSht40 {
    static int sensor_count;
};

// 所有传感器共用一个 count
SensorSht40 s1;
SensorSht40 s2;

s1.count = 1;
s2.count = 2; 
// s1.count 也变成 2!

6. 超级总结(3 句话背会)

  1. static 成员属于类,不属于对象
  2. static 函数没有 this 指针 → 能当 FreeRTOS 任务
  3. static 函数能访问 private → 完美封装

对应你现在的代码

cpp

运行

复制代码
static void readTaskWrapper(void *arg);

这就是 C++ + FreeRTOS 最标准、最安全、最正确的写法

如果你愿意,我可以给你一个万能模板,以后所有传感器、电机、屏幕类都能直接复制使用!

相关推荐
bubiyoushang8882 小时前
基于 C/C++ 的 MQTT 物联网通信协议实现
c语言·c++·物联网
牛油果子哥q2 小时前
【C++ const 】全场景深度精讲:修饰规则、底层常量折叠、指针 / 引用 / 成员函数实战、易错坑点与工程代码实现
开发语言·c++
郝学胜_神的一滴2 小时前
Qt 高级开发 025:打造优雅界面的艺术与高效重构之道
c++·qt
牛油果子哥q2 小时前
【C++指针与引用】C++指针与引用底层彻底精讲:本质区别、易错深坑、底层内存模型、工程选型、笔试面试满分解析
c++·面试
十五年专注C++开发2 小时前
CMake实践:VS2019控制台程序隐藏控制台方法
c++·windows·cmake·控制台隐藏
小欣加油3 小时前
leetcode3635 最早完成陆地和水上游乐设施的时间II
数据结构·c++·算法·leetcode
QT-Neal3 小时前
链接和库整理
c++
剑锋所指,所向披靡!3 小时前
C++多线程实现
开发语言·c++·chrome
十五年专注C++开发3 小时前
Qt之QScopedPointer、QScopeGuard、QScopedValueRollback使用及源码解读
开发语言·c++·qt·qscopedpointer·qscopeguard