首页 > 解决方案 > Vector 似乎会根据使用位置改变类型

问题描述

编辑:解决方案:我试图在成员函数上创建一个指针,并认为该指针将包含有关该类的所需信息。事实证明它没有。因此,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 在小弹出信息中显示的类型。

但是,一旦我在成员函数中使用该向量,弹出信息就会显示一些不同的内容,并且它告诉我需要使用指向类型的指针。 它告诉我向量有类型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)告诉我别的东西......

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

标签: c++eventsvectormember-function-pointers

解决方案


推荐阅读