矢量看似改变类型取决于它的使用位置

时间:2018-05-02 19:44:41

标签: c++ events vector member-function-pointers

编辑: 解决方案: 我试图在一个成员函数上创建一个指针,并认为指针将包含有关该类的必需信息。事实证明它没有。 所以Intellisense绝对正确的指针没有指向具有成员函数的对象,而只指向成员函数(或者至少是我理解它的方式)。

在我的情况下,我能够简单地使用静态成员函数而不是这个函数不能在没有引用外部对象的情况下更改任何成员函数

,感谢您花时间帮助我。

我目前正在研究某种事件系统。我有一个类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在小弹出信息中显示的类型。

但是只要我在成员函数中使用该向量,popup-info就会显示不同的内容,它告诉我需要使用指针类型。 它告诉我,向量的类型为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不是成员函数指针而是通常的函数指针 - &gt;但是void (InputForm::*e)(KEY_EVENT_RECORD)告诉了我别的......

我真的不知道这里发生了什么。你有好主意吗? 非常感谢你提前。

0 个答案:

没有答案