2012-04-05 106 views
0

我在MyClass中有這個靜態回調函數,並且我嘗試從它調用另一個靜態函數。但是,有一個問題,Register()採用的參數之一是非靜態類變量。靜態函數中的非靜態參數

我想過使用「this」關鍵字來克服這個問題,但似乎我無法('this':只能在非靜態成員函數內引用)。這裏是我的代碼:

class MyClass 
{ 
... 
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam); 
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK); 
    KEYBLOCK *kb;  
... 

} 
LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam); 
    if (wParam == WM_KEYDOWN) 
    { 
     MyClass::Register(p->vkCode,this->kb); 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

有什麼建議嗎?

+0

靜態函數無法訪問實例成員。你想從哪裏得到實例? – 2012-04-05 16:10:21

+0

您是否有地方將額外的數據傳遞到註冊回調的地方?如果是這樣,你可以在裏面傳遞'this'。 – Nate 2012-04-05 16:12:11

回答

1

鑑於您所寫的內容很難在沒有更多信息的情況下回答。

但是,假設的MyClass所有實例應該被處理,我建議增加一個static std::list<MyClass *>在其中可以將每個實例的this指針在構造函數MyClass然後在MyClass析構函數從該名單中刪除this

然後在靜態klHkProc(),你會遍歷的MyClass所有實例的靜態列表,併爲每一個呼叫MyClass::Register()MyClass每個這樣的註冊實例的kb

下面是代碼的一個粗略的輪廓要做到這一點:

class MyClass 
{ 
... 
public: 
    static LRESULT CALLBACK klHkProc(int nCode, WPARAM wParam, LPARAM lParam); 
    static BOOL Register(DWORD vKey,KEYBLOCK* ptrKEYBLOCK); 
    static std::list<MyClass *> allInstances; 
    KEYBLOCK *kb; 

    MyClass() { 
     ... 
     allInstances.push_back(this); 
     ... 
    } 
    ~MyClass() { 
     ... 
     // Assumes not a huge list of instances as this is O(n) and thus destruction 
     // of all instances of MyClass in O(n^2) on the number of instances. 
     allInstances.remove(this); 
     ... 
    } 

... 
}; 

LRESULT CALLBACK MyClass::klHkProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam); 
    if (wParam == WM_KEYDOWN) 
    { 
     std::list<MyClass *> itr = allInstances.begin(); 
     std::list<MyClass *> end = allInstances.end(); 
     for (; itr != end; ++itr) { 
      MyClass *current = *itr; 
      MyClass::Register(p->vkCode, current->kb); 
     } 
    } 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 
+0

該類的每個實例都有一個指向當前KeyBlock對象的指針,因爲每個實例使用不同的密鑰塊,所以每個實例都需要不同。我想使用Register功能將按鍵錄製到特定實例的KeyBlock對象中 – 2012-04-05 16:20:32

+0

因此,這是來自用戶的按鍵事件以及您希望採取註冊操作的每個按鍵事件? – WilliamKF 2012-04-05 16:23:44

+0

是的,這就是我想要的 – 2012-04-05 16:25:07

0

有一個靜態成員和任何特定的對象實例之間不存在隱式連接。

您可以將指針或對MyClass對象的引用傳遞給klHkProc(),然後它可以傳遞給Register()

0

一般來說,如果KEYBLOCK * kb不是靜態的,則不能在靜態函數內引用它。 'this'指針只在對象的實例中才有意義。因此,如果KEYBLOCK * kb僅在實例化對象內部有意義,那麼您必須在Register或klHkProc中實例化一個MyClass。如果你給了我們一個更好的寄存器應該做什麼的上下文,而不僅僅是顯示調用者,那麼確定後者是否有意義實例化MyClass在Register中是否有意義。