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_back
到keyPressedEvent
向量(,并且当按键被按下时,每个系统都将拥有该信息。
问题
在我在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::函数对象(。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 为什么我的主文件.cpp不打印头文件中的任何内容
- 生成文件错误 - 找不到文件 - *.cpp
- 如何在文件.cpp gtkmm中声明小部件
- 没有实现文件(.cpp)的派生类
- 如何使用"CMakeLists.txt"中的add_library将整个文件(.cpp,.h等)包含在目录中
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- 文件.cpp从Windows到Linux
- Ubuntu C++ 编译器错误: g++: 错误: 文件.cpp: 没有这样的文件或目录
- 如何将文件.cpp编译为本机编译
- 使用模板类时,似乎无法包含除 main 以外的任何 cpp 文件.cpp
- 无法编译C++文件.cpp。C++98模式
- 为什么C++头文件不需要包含实现文件 (.cpp)
- 如何访问位于独立文件(.cpp)中的非成员函数
- 如何在Visual Studio Code中通过键盘快捷键切换头文件/cpp文件
- 如何将数据从stringstream写入文件(CPP)
- 为什么filestream不把空白写入文件cpp ?