2012-04-05 19 views
0

私はこの静的コールバック関数をMyClassに持っていますが、私はそこから別の静的関数を呼び出そうとしています。しかし、問題はありますが、Register()がとる引数の1つは非静的なクラス変数です。静的関数内の非静的パラメータ

私はこの問題を克服するために "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

静的関数はインスタンスメンバーにアクセスできません。どこからインスタンスを取得したいですか? –

+0

コールバックを登録する場所に余分なデータを渡す場所がありますか?もしそうなら、そこに 'this'を渡すことができます。 – Nate

答えて

1

あなたが書いたことを考えれば、これ以上の情報なしでこれに答えることは難しいです。

しかし、MyClassのすべてのインスタンスが処理されるべきであると仮定し、私はあなたがMyClassのコンストラクタ内の各インスタンスのthisポインタを置くと、その後MyClassのデストラクタでこのリストからthisを削除するにはその中にstatic std::list<MyClass *>を追加することをお勧めします。

は、その後、あなたの静的klHkProcに()あなたは MyClassのすべてのインスタンスの静的リスト上と MyClassのような各登録インスタンスの kb各1つのコール MyClass::Register()のために反復します。

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オブジェクトへのポインタがあります。各インスタンスは異なるキーブロックを使用するため、各インスタンスごとに異なる必要があります。特定のインスタンスのKeyBlockオブジェクトにキー押下を記録するために登録機能を使用したいと思います –

+0

これはユーザーからのキー押下イベントであり、各キー押下イベントで登録されたアクションを実行しますか? – WilliamKF

+0

はい、それは私が欲しいものです。 –

0

静的メンバーと任意の特定のオブジェクトインスタンスの間には暗黙的な接続はありません:

ここでこれを実行するコードの大まかな概要です。

MyClassオブジェクトへのポインタまたは参照をklHkProc()に渡すと、Register()に渡すことができます。

0

一般に、KEYBLOCK * kbが静的でない場合、静的関数内でそれを参照することはできません。 'this'ポインタは、オブジェクトのインスタンス内でのみ意味を持ちます。 KEYBLOCK * kbがインスタンシエートされたオブジェクト内でのみ意味を持つ場合、RegisterまたはklHkProc内でMyClassをインスタンス化する必要があります。後者がRegister内でMyClassをインスタンス化するのが意味を成すかどうかを判断する方が簡単でしょう。そうしないと、呼び出し側を表示するだけでなく、Registerが行うべきことのより良いコンテキストを提供できます。

関連する問題