类方法中的 Arduino C++ 回调

问题描述 投票:0回答:1

我是 Arduino 和 C++ 新手,我对 arduino (c++)、类和类方法中的“this”有疑问:

我创建classname.cpp和classname.h 在 classname.cpp 中,我尝试以某种方式获取“this”(ClassName 实例)(下面的示例):

ClassName::ClassName(){}

...
void SomeCallback(char* name, uint8_t age){
    // how to get "this" object (ClassName)?
}
...
void ClassName::Init(){
    this->someobj->setCallback(someCallback); // callback signature <void(char*, uint8_t)>
}

在此解决方案中,我没有编译器错误,但在某些回调中我无法得到“那个”

问题是: 如何修改 Init 方法或 someCallback 函数以在 SomeCallback 中获取“this”?

我尝试将一些回调放入类中,如下所示:

ClassName::SomeCallback(char* 名称, uint8_t 年龄)

c++ class arduino callback this
1个回答
0
投票
void SomeCallback(char* name, uint8_t age){
    // how to get "this" object (ClassName)?
}

由于该函数不是该类的成员,因此没有

this
可供其引用。如果您的代码中有三个 ClassName 实例,那么它应该引用哪个
this

类成员使用 this 来引用它们所属的类实例。当您创建实例并使用它们时:

ClassName instance1
ClassName instance2

void setup() {

   instance1.Init();
   instance2.Init();
}

对于第一次调用

Init
this
指向实例 1。第二次调用
Init
this
指向实例 2。

但是在你的回调方法中它不是类的成员。所以它不会被类实例调用,所以它没有

this

如何解决这个问题取决于您希望程序做什么。如果您只有该类的一个实例,则将其设为单例。或者甚至不把它作为一堂课。如果您有多个实例,那么一种选择是拥有一个指向实例的静态指针列表,并让实例通过将自身添加到该列表来“注册”自己以进行回调。

© www.soinside.com 2019 - 2024. All rights reserved.