如何使用静态回调访问对象属性?

时间:2012-12-21 01:46:22

标签: c++ callback static-methods

说明

我遇到了第三方库的问题,这个库名为TVideoGrabber。当我将函数的地址传递给库时,我无法从回调方法访问MyClass方法和属性。

m_pAPI->SetCallback(OnCallback);

上面这一行将OnCallback地址传递给API。一旦API在更新时调用OnCallback方法。到目前为止,此工作正常。

有问题的一行:

a->SetA(api->GetNumber());

我知道上面的语法不正确,但它应该说明我正在尝试做什么,我想从API设置A的值。

问题:

当API调用OnCallback函数时,sender是m_pAPI对象的地址,我无法访问MyClass对象。

问题:

如何访问MyClass对象

以下是完整的代码示例:

void MyClass::OnCallback(void* Object, void* sender) 
{
     API* api = (API*)(sender);

    // NO ACCESS TO MyClass properties or methods :( 
    a->SetA(api->GetNumber());  
}

class MyClass
{
    public:
          MyClass();
          ~MyClass();

          static void CALLBACK OnCallback(void* Object, void* sender);
          void SetA(int a);
          int GetA() const;

    private:
          API* m_pAPI;
          int a;  
}

MyClass::MyClass()
      : a(0)
{
    m_pAPI = new API;

    // Register for callbacks
    m_pAPI->SetCallback(OnCallback);
}

MyClass::~MyClass()
{
    delete m_pAPI;
}

int main()
{
    MyClass my;
    std::cout << "Value from API is " << my.GetA();

    return 0;
}

提前致谢!期待您的回复!

1 个答案:

答案 0 :(得分:1)

尝试替换:

m_pAPI = new API;

由:

m_pAPI = new API(this);

这将使用TVideoGrabber.h中的CVideoGrabber类的第二个构造函数:

CVideoGrabber (void* classPtr); 

并且类的实例的指针将由回调事件的“sender”参数返回。