[英]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::function 对象)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.