Вектор вроде бы меняет тип в зависимости от того, где он используется - PullRequest
0 голосов
/ 02 мая 2018

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) говорит мне что-то еще ...

Я действительно понятия не имею, что здесь происходит. У вас есть идея? Заранее большое спасибо.

...