Я создал эту учетную запись, чтобы задать вопрос, потому что я потерял прямо сейчас, и я не смог найти ответ. Я не уверен, что то, что я пытаюсь сделать, даже возможно, или, возможно, я использую неправильный подход.Хранение указателя функции как члена внутри класса
Я пишу класс оболочки стека Windows для асинхронных сокетов, в основном, поэтому мне больше не нужно писать этот код, и я пытаюсь сохранить указатель на функцию как переменную-член внутри класса netcode, которая указывает на обработчиком событий Windows, который вызван в обычный служебный насос сообщений win32 приложения, который указывает в другом месте. В принципе, я пытаюсь создать определенную программистом функцию обратного вызова, так что, когда я скомпилирую этот класс netcode в .dll, мне больше не придется его трогать.
В качестве пояснения, что я пытаюсь сделать, например, написать обработчик событий для WM_SOCKET
(который является сообщением Windows, которое я определил) где-то, кроме внутри класса сетевого кода (поэтому он может быть переносимым к различным проектам win32/C++) и за пределами основного насоса сообщений win32 (поэтому мой WndProc()
не становится абсолютно массивным).
Я даже не знаю, что искать, но вся информация, которую я нахожу, - это создание указателя на функцию-член или элемент-шаблон, который я не хочу.
Вот код, который я уже пытался написать (только соответствующие биты), что и дает мне проблемы. Вероятно, я, вероятно, навязываю что-то здесь.
//// Sockets.h
class NetworkConnection
{
private:
void (*WMSocketFunction)(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
public:
void HandleEvents(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void registerSocketFunction(void (*SocketFunction(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)));
};
//// Sockets.cpp
#include "Sockets.h"
void NetworkConnection::registerSocketFunction(void (*SocketFunction(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)))
{
WMSocketFunction = SocketFunction;
};
void NetworkConnection::HandleEvents(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
WMSocketFunction(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
}
//// Application.cpp
void SocketEventHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Do socket stuff here
};
int SetupApp()
{
NetworkConnection NetConnection;
NetConnection.registerSocketFunction(&SocketEventHandler);
return 0;
}
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_SOCKET:
{
NetConnection.HandleEvents(hwnd, msg, wParam, lParam);
break;
}
case WM_DESTROY:
{
ReleaseDevices();
break;
}
case WM_KEYDOWN:
{
#ifdef _DEBUG
if (lParam == VK_ESCAPE)
PostQuitMessage(0);
#endif
}
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
}
Я был бы очень благодарен за помощь, здесь. Я совершенно не понимаю, почему это не работает.
Ошибки, которые я получаю, являются:
Error 1 error C2440: '=' : cannot convert from 'void *(__cdecl *)(HWND,UINT,WPARAM,LPARAM)' to 'void (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' sockets.cpp (in function registerSocketFunction)
Error 2 error C2275: 'HWND' : illegal use of this type as an expression sockets.cpp (in function HandleEvents)
Error 3 error C2146: syntax error : missing ')' before identifier 'hwnd' sockets.cpp (in function HandleEvents)
Error 4 error C2059: syntax error : ')' sockets.cpp (in function HandleEvents)
Error 8 error C2664: 'NetworkConnection::registerSocketFunction' : cannot convert parameter 1 from 'void (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' to 'void *(__cdecl *)(HWND,UINT,WPARAM,LPARAM)' application.cpp
Если вам нужны какие-либо лучшего объяснения, потому что я, вероятно, объяснил эту проблему плохо, пожалуйста, не стесняйтесь спрашивать.
Я использую Visual Studio 2010, поэтому я не думаю, что могу использовать функции C++/11, такие как std :: function.
Можете ли вы объяснить, почему вы включили тег C? –
Это был один из предложенных тегов. Позвольте мне это исправить. –