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