Почему я не могу использовать функцию-член класса C++ в качестве оконной процедуры Win32? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему я не могу использовать функцию-член класса C++ в качестве оконной процедуры Win32? [дубликат]

Сообщение Anonymous »

Я разрабатываю собственный игровой движок на C++ и в настоящее время работаю над управлением окнами.
Моя цель — сделать движок легко переносимым, чтобы программирование игр с его помощью не было привязано к конкретной операционной системе. На данный момент я поддерживаю Windows. Чтобы создать окно с помощью Win32 API, вам необходимо определить и зарегистрировать класс окна. Одним из требований к классу окна является оконная процедура, и именно здесь я столкнулся с проблемой.
Мне хотелось бы, чтобы каждый объект Window в моем движке имел свою собственную оконную процедуру, но когда я пытаюсь поместить процедуру внутри класса Window, компилятор отклоняет ее. Кажется, это ограничивает меня только одной глобальной оконной процедурой для всех окон, что не идеально.
Вот минимальный пример, воспроизводящий ошибку:

Код: Выделить всё

// Example window class
class Window {
public:
// Each window should have its own procedure.
LRESULT CALLBACK window_procedure(HWND, UINT, WPARAM, LPARAM);
// Other members...
};

// Registering a window class somewhere in the code.
Window window;
WNDCLASS wc = { 0 };
wc.lpfnWndProc = window.window_procedure; // Error occurs here
Ошибка компилятора:

Код: Выделить всё

g++ test.cpp -o test
test.cpp: In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':
test.cpp:12:33: error: cannot convert 'Window::window_procedure' from type
'LRESULT (Window::*)(HWND, UINT, WPARAM, LPARAM)'
to type 'WNDPROC' {aka 'LRESULT (*)(HWND, UINT, WPARAM, LPARAM)'}
12 |         wc.lpfnWndProc = window.window_procedure;
|                                 ^~~~~~~~~~~~~~~~
Я могу исправить ошибку, выполнив следующие действия:

Код: Выделить всё

WNDCLASS wc = { 0 };
auto window_procedure = [](HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) -> LRESULT CALLBACK {
// process the message...
};
wc.lpfnWndProc = window_procedure;
Определение лямбда-функции вместо обычной функции-члена решает проблему, но мне интересно узнать, почему произошла исходная ошибка.
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -procedure
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»