如何从对象调用我的设置回调函数?
How can I call my set my callback function from an object?
这是一些代码:
typedef void (*ACallBack)(int i);
class SomeClass
{
private:
ACallBack aCallBack;
public:
void SetCallBack(ACallBack aCallBack);
};
void SomeClass::SetCallBack(ACallBack aCallBack)
{
this->aCallBack = aCallBack;
}
class SomeOtherClass
{
private:
SomeClass someClass;
public:
void InitializeSomeClass();
private:
void callBackMethod(int i);
};
void SomeOtherClass::InitializeSomeClass()
{
this->changeVariable = 10;
this->someClass.SetCallBack(this->callBackMethod); // DOESN'T WORK
this->someClass.UseCallBack();
}
void SomeOtherClass::callBackMethod(int i)
{
}
void globalCallBack(int i)
{
int myInt = i;
}
int main()
{
SomeClass sC;
sC.SetCallBack(globalCallBack); //WORKS!!
}
基本上,如果我尝试在 SomeOtherClass
中设置我的回调函数,它不起作用,但是当我在 main
中全局设置它时,它会起作用。我在这里错过了什么?
您必须将方法设为静态:
static void callBackMethod(int i, void* userData);
如果您需要一个指向非静态方法的指针,即实例方法,它会变得更加复杂。
typedef void ( myclass::*FUNC ) (int i, void* userData);
如果你想使用它,它就变得很麻烦:
myclass obj; // instantiate myclass
FUNC f = &myclass::myfunc; // assign address
( obj.*f ) ( 123, NULL ); // and call it
只需使用 std::function
和 std::bind()
:
typedef std::function<void(int i)> ACallBack;
// old code pretty much the same
int main()
{
using namespace std::placeholders;
SomeClass sC;
sC.SetCallBack(globalCallBack); //WORKS!!
SomeOtherClass oC;
sC.SetCallBack(std::bind(&SomeOtherClass::callBackMethod,oC,_1)); //WORKS AS WELL!!
}
在这种情况下,您实际上不需要传递 void *userData
,但如果您需要旧代码进行编译,也可以添加它。
这是一些代码:
typedef void (*ACallBack)(int i);
class SomeClass
{
private:
ACallBack aCallBack;
public:
void SetCallBack(ACallBack aCallBack);
};
void SomeClass::SetCallBack(ACallBack aCallBack)
{
this->aCallBack = aCallBack;
}
class SomeOtherClass
{
private:
SomeClass someClass;
public:
void InitializeSomeClass();
private:
void callBackMethod(int i);
};
void SomeOtherClass::InitializeSomeClass()
{
this->changeVariable = 10;
this->someClass.SetCallBack(this->callBackMethod); // DOESN'T WORK
this->someClass.UseCallBack();
}
void SomeOtherClass::callBackMethod(int i)
{
}
void globalCallBack(int i)
{
int myInt = i;
}
int main()
{
SomeClass sC;
sC.SetCallBack(globalCallBack); //WORKS!!
}
基本上,如果我尝试在 SomeOtherClass
中设置我的回调函数,它不起作用,但是当我在 main
中全局设置它时,它会起作用。我在这里错过了什么?
您必须将方法设为静态:
static void callBackMethod(int i, void* userData);
如果您需要一个指向非静态方法的指针,即实例方法,它会变得更加复杂。
typedef void ( myclass::*FUNC ) (int i, void* userData);
如果你想使用它,它就变得很麻烦:
myclass obj; // instantiate myclass
FUNC f = &myclass::myfunc; // assign address
( obj.*f ) ( 123, NULL ); // and call it
只需使用 std::function
和 std::bind()
:
typedef std::function<void(int i)> ACallBack;
// old code pretty much the same
int main()
{
using namespace std::placeholders;
SomeClass sC;
sC.SetCallBack(globalCallBack); //WORKS!!
SomeOtherClass oC;
sC.SetCallBack(std::bind(&SomeOtherClass::callBackMethod,oC,_1)); //WORKS AS WELL!!
}
在这种情况下,您实际上不需要传递 void *userData
,但如果您需要旧代码进行编译,也可以添加它。