2012-12-21 53 views
0

说明:如何访问具有静态回调的对象属性?

我在与第三方库的问题

,该库被称为TVideoGrabber。当我将函数的地址传递给库时,我无法从回调方法访问MyClass方法和属性。

m_pAPI->SetCallback(OnCallback); 

上面这行代码将OnCallback地址传递给API。一旦API有更新时调用OnCallback方法。迄今为止,这工作得很好。

有问题的行:

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

我知道,上面的语法不正确,但应说明什么,我试图做的,我想设置一个从价值API。

问题:

当API调用OnCallback功能发送者是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

为此,api和myclass之间必须有一些连接。典型的情况是它与OnCallback一起被传入。或者可能该“this”被保存为SetCallback的一部分并作为“对象”传递。但是对于给定的代码,这是不可能说的。 –

+1

如果他们有SetCallback(),他们应该有SetSender()或SetCallBackSender()。通常,当SetCallback在第三方API中定义时,它有两个参数:CallBack函数指针和发送者的void * – cha

回答

1

尝试更换:

m_pAPI = new API; 

由:

m_pAPI = new API(this); 

这将使用CVideoGrabber类从TVideoGrabber.h第二构造:

CVideoGrabber (void* classPtr); 

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