2012-12-21 58 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」參數返回。