c++ - 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_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::function 对象)。
推荐阅读
- javascript - JavaScript - 无法在 IF 语句中实现多个 Or
- angular - 调度凭证 store.dispatch(new Login(userName, password))
- python - 如何解决pycharm中的“NameError:名称'x'未定义”
- google-apps-script - 类型错误:在对象 GmailMessage 中找不到函数 forEach
- angular - 为什么这个属性在函数内部不起作用?
- visual-studio-2019 - 在 Visual Studio 2019 中保存项目文件会还原 csproj 文件中的更改
- c++ - 在循环中构造 QTextStream 会导致文件错误地读取数据
- javascript - Javascript无限循环
- python - Pandas - 如何将所有数据框添加到字典中
- python - 如何读取文件并将某些数字从使用关键字复制到excel或另一个txt文件中?