C++-试图将函数指针推回到另一个CPP文件中的矢量时出错

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

本文关键字:文件 CPP 出错 另一个 函数 指针 C++-      更新时间:2023-10-16

简介

我是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::函数对象(。