我需要在同一个类的静态成员函数中调用一个非静态成员函数。静态函数是一个回调函数,它只能接收void类型的数据,尽管我通过char*传递一个值。因此,我无法直接将类实例提供给回调函数。我可以传递一个结构体代替char到回调函数中。请问有没有任何示例代码可以在静态成员函数中使用结构体来调用非静态成员函数并解决这个问题?
通常这样的回调会像这样:
void Callback( void* data)
{
CMyClass *myClassInstance = static_cast<CMyClass *>(data);
myClassInstance->MyInstanceMethod();
}
CMyClass* data = new CMyClass();
FunctionCallingMyCallback( data, &Callback);
delete data;
MyStruct* data = new MyStruct();
data->PtrToMyClass = new CMyClass();
data->MyCharPtr = "test";
FunctionCallingMyCallback( data, &Callback);
delete data->PtrToMyClass;
delete data;
void Callback( void* data)
{
MyStruct *myStructInstance = static_cast<MyStruct *>(data);
CMyClass *myClassInstance = myStructInstance->PtrToMyClass;
char * myData = myStructInstance->MyCharPtr;
myClassInstance->MyInstanceMethod(myData);
}
class MyClass {
private:
MyClass():myInstance(0) {}
static MyClass *myInstance;
void callback();
public:
~MyClass() {}
static MyClass *getInstance();
static void myCallback();
};
MyClass *MyClass::getInstance() {
if(!myInstance) {
myInstance = new MyClass;
}
return myInsance;
}
void MyClass::callback() {
// non-static callback
}
void MyClass::myCallback() {
getInstance()->callback();
}
如果您不使用单例模式,但可以将实例强制转换为void *
,那么您可以改用以下方法:
void MyClass::myCallback(void *data) {
MyClass *instance = static_cast<MyClass *>(data);
instance->callback();
}
getInstance
方法与私有/受保护的构造函数结合使用,可以限制对单个实例的访问。 - sje397myInstance
也应该被设置为静态的。 - Kargath这是唯一的方法:
#include <iostream>
#include <cassert>
struct A;
A *oneObj = NULL;
struct A
{
A(){
oneObj=this;
}
~A(){
oneObj=NULL;
}
void foo()
{
}
static void boo()
{
assert( NULL != oneObj );
oneObj->foo();
}
};
int main()
{
A onlyOne;
A::boo();
}
class A {
//...
static void CallBack (A *pObj)
{
// logic
}
};