2012-04-05 2 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

Статические функции не могут получить доступ к экземплярам экземпляра. Откуда вы хотите получить экземпляр? –

+0

У вас есть место для передачи дополнительных данных там, где вы регистрируете обратный звонок? Если это так, вы можете передать 'this' там. – Nate

ответ

1

Учитывая то, что вы написали, трудно ответить на этот вопрос без дополнительной информации.

Однако, если предположить, что все экземпляры MyClass должны быть обработаны, я предлагаю добавить static std::list<MyClass *>, в которую вы поместите this указатель каждого экземпляра в конструкторе для MyClass, а затем в деструкторе MyClass, чтобы удалить this из этого списка.

Затем в статическом klHkProc() вы бы перебрать статический список всех экземпляров MyClass и для каждого одного вызова MyClass::Register() с kb каждого такого зарегистрированного экземпляра MyClass.

Вот грубый набросок кода, чтобы сделать это:

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 конкретного экземпляра –

+0

Итак, это событие нажатия клавиши от пользователя и каждое событие нажатия клавиши, которое вы хотите принять зарегистрированным действием? – WilliamKF

+0

Да, это то, что я хочу –

0

Там нет неявной связи между статическим элементом и любым конкретным экземпляром объекта.

Вы можете передать указатель или ссылку на объект MyClass на номер klHkProc(), который затем перейдет на Register().

0

Вообще говоря, если KEYBLOCK * kb не является статическим, вы не можете ссылаться на него внутри статической функции. указатель 'this' имеет смысл только внутри экземпляра объекта. Итак, если KEYBLOCK * kb имеет смысл только внутри объекта-объекта, вам нужно создать экземпляр MyClass внутри Register или klHkProc. Было бы легче определить, имеет ли смысл создавать экземпляр MyClass внутри Регистра или нет, если вы дали нам лучший контекст того, что должен делать реестр, а не просто показывать вызывающего.

Смежные вопросы