EDIT:
Решение:
Я попытался создать указатель на функцию-член и подумал, что указатель будет содержать необходимую информацию о классе. Оказалось, что это не так.
Так что Intellisense был абсолютно прав насчет указателя, указывающего не на объект с функцией-членом, а только на функцию-член (или, по крайней мере, так я ее понял).
В моем случае я мог просто использовать статическую функцию-член вместо события, хотя эта функция не может изменять какие-либо функции-члены без ссылки на внешний объект
Привет и спасибо, что нашли время помочь мне.
В настоящее время я работаю над некой Event-системой. У меня есть класс InputManager, который проверяет, вызывается ли проверка функции-члена для событий, обнаруженных в окне консоли, а затем вызывает соответствующие обработчики событий, которые хранятся в векторах-указателях-функциях-членах (позже я сделаю это шаблоном ).
class InputManager
{
private:
HANDLE cursor;
DWORD numEventsCaught, consoleMode, i;
INPUT_RECORD eventBuffer[128];
std::vector<void (InputForm::*)(KEY_EVENT_RECORD)> keyEventHandlers;
std::vector<void (InputForm::*)(MOUSE_EVENT_RECORD)> mouseEventHandlers;
public:
InputManager()
void addKeyEventHandler(void (InputForm::*e)(KEY_EVENT_RECORD));
void addMouseEventHandler(void (InputForm::*e)(MOUSE_EVENT_RECORD));
void check();
};
Как видите, текущий тип моего вектора - это указатель на функцию-член класса InputForm с определенным параметром. Это также тип, который Visual Studio показывает мне в маленькой всплывающей информации.
Но как только я использую этот вектор внутри функции-члена, всплывающая информация показывает что-то другое, и она говорит мне, что мне нужно использовать указатель на тип.
Это говорит мне, что вектор получил тип void (KEY_EVENT_RECORD)
вместо void (InputForm::*)(KEY_EVENT_RECORD)
.
Понятия не имею, как это может произойти - я имею в виду, как тип вектора может меняться только в зависимости от области его использования?
Вот функция, в которой возникает проблема (но это также происходит в любой другой функции):
void InputManager::check()
{
int size;
if (!ReadConsoleInput(cursor, eventBuffer, 128, &numEventsCaught))
POST_DEBUG_MESSAGE(-1, "Failed to Read Console Input");
for (i = 0; i < numEventsCaught; i++)
{
switch (eventBuffer[i].EventType)
{
case KEY_EVENT:
size = keyEventHandlers.size();
for (int x = 0; x < size; x++)
{
keyEventHandlers[x](eventBuffer[i].Event.KeyEvent); //ERROR ONE
}
break;
case MOUSE_EVENT:
size = mouseEventHandlers.size();
for (int x = 0; x < size; x++)
{
mouseEventHandlers[x](eventBuffer[i].Event.MenuEvent); //ERROR TWO
}
}
}
}
На всякий случай, если вы хотите просмотреть весь код, вот он (в противном случае просто проигнорируйте его)
InputManager::InputManager()
{
cursor = GetStdHandle(STD_INPUT_HANDLE);
if (cursor == INVALID_HANDLE_VALUE)
POST_DEBUG_MESSAGE(-1, "Invalid Handle Value, GetStdHandle failed.");
// Deactivate Quickedit
consoleMode = ENABLE_EXTENDED_FLAGS;
if (!SetConsoleMode(cursor, consoleMode))
POST_DEBUG_MESSAGE(-1, "Failed to set Console Mode (Couldn't deactivate Quickedit)");
// Activate mouse and window input
consoleMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
if (!SetConsoleMode(cursor, consoleMode))
POST_DEBUG_MESSAGE(-1, "Failed to activate mouse or window inputs");
}
void InputManager::addKeyEventHandler(void (InputForm::*e)(KEY_EVENT_RECORD))
{
keyEventHandlers.push_back(e); // Works properly
}
void InputManager::addMouseEventHandler(void (InputForm::*e)(MOUSE_EVENT_RECORD))
{
mouseEventHandlers.push_back(e);
}
Что также может быть интересно в том, что даже если keyEventHandlers.push_back(e)
работает правильно, это также говорит мне, что e не указатель на функцию-член, а обычный указатель на функцию -> но void (InputForm::*e)(KEY_EVENT_RECORD)
говорит мне что-то еще ...
Я действительно понятия не имею, что здесь происходит. У вас есть идея?
Заранее большое спасибо.