繁体   English   中英

C++ - 尝试将函数指针推回位于另一个 CPP 文件中的向量时出错

[英]C++ - Error when trying to push_back a function pointer to a vector located in another CPP File

介绍

我是 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向量)我注意到它工作正常,我创建的测试函数被正确调用,所以我决定在其余部分实现系统的,这意味着......在其他翻译单元中。

这就是我所做的:

  • pacman.h 文件:

     typedef void(*KeyPressedFunction)(sf::Keyboard::Key); extern std::vector<KeyPressedFunction> keyPressedEvent; class Pacman { public: Pacman(float x, float y); void OnKeyPressed(sf::Keyboard::Key key); };
  • pacman.cpp 文件:

     #include "Pacman.h" #include <iostream> void Pacman::OnKeyPressed(sf::Keyboard::Key key) { } Pacman::Pacman(float x, float y) { keyPressedEvent.push_back(*OnKeyPressed); }

导致所有麻烦的那一行是keyPressedEvent.push_back(*OnKeyPressed); 这个,即使我的做法与我之前测试“事件系统”时的做法相同。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM