首页 > 解决方案 > C++ - 尝试 push_back 指向位于另一个 CPP 文件中的向量的函数指针时出错

问题描述

介绍

我是 C++ 新手,在我尝试解释我的问题时请记住这一点。

我正在用 C++ 制作一个游戏来帮助我更好地理解语言,当我制作这个项目时,我决定我需要事件(比如 C# 事件)来帮助我完成这个项目,经过一些研究我发现C++ 没有类似于 C# 的事件处理程序系统,所以我尝试做一些与 C# 事件处理程序以相同方式工作的事情。

在 Main.cpp 文件中我创建了这个:

typedef void(*KeyPressedFunction)(sf::Keyboard::Key);
std::vector<KeyPressedFunction> keyPressedEvent;
int main()
{
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                window.close();
                break;
            case sf::Event::KeyPressed:
                for (KeyPressedFunction func : keyPressedEvent)
                {
                    func(event.key.code);
                }
                break;
            }
        }
    }
}

这个想法是,每个想知道何时按下键的类都将订阅事件(向量) push_backkeyPressedEvent并且当按下键时,每个系统都会拥有该信息。

问题

在我在 main.cpp 文件中测试系统(创建一个函数并推回keyPressedEvent向量)后,我注意到它工作正常,我创建的测试函数被正确调用,所以我决定在其余部分中实现系统,这意味着……在其他翻译单元中。

这就是我所做的:

造成所有麻烦的那一行就是这一行keyPressedEvent.push_back(*OnKeyPressed);,即使我正在以与之前测试“事件系统”时相同的方式进行操作。

错误是:“'*' 的操作数必须是指针”

我认为这个错误与位于另一个翻译单元中的向量有关,但我不知道如何解决。

标签: c++pointersevents

解决方案


问题是这Pacman::OnKeyPressed是一个方法(非静态成员函数),而不是常规函数。(顺便说一句,它与翻译单位无关)。如果该函数是静态的,您的代码就可以了。

一种解决方案是使用std::function而不是函数指针,并std::bind使其脱离成员函数(另请参阅在一个类中使用具有成员函数的通用 std::function 对象)。


推荐阅读