我试图从另一个类中运行一个类的方法,我有一个基本的 GUI,让用户填写他的名字和密码,当它点击登录按钮时,另一个接管并处理事件,我我想在成功登录的情况下设置回调,但我在将函数指针发送到我的处理程序时遇到问题。
我做了一个我想做的事情的原始例子。
#include <iostream>
using namespace std;
class LoginHandler {
public:
void loginAttempt(bool result)
{
if(result == true)
{
cout << "Login success! W00t!" << endl;
//Run my callback :)
callback();
} else {
cout << "Login failed." << endl;
}
}
void setCallback(void (*cb)())
{
callback = cb;
}
private:
void (*callback)();
};
class Foo {
public:
void run()
{
LoginHandler* loginHandler = new LoginHandler();
loginHandler->setCallback(&Foo::sayHello);
loginHandler->loginAttempt(false);
loginHandler->loginAttempt(true);
}
void sayHello()
{
cout << "You actually logged in! Isn't that amazing!?" << endl;
}
};
int main()
{
Foo foo;
foo.run();
return 0;
}
我遇到下一个错误:
In member function 'void Foo::run()':
error: no matching function for call to 'LoginHandler::setCallback(void (Foo::*)())'
note: candidate is: void LoginHandler::setCallback(void (*)())
note: no known conversion for argument 1 from 'void (Foo::*)()' to 'void (*)()'
谢谢你的建议。
最佳答案
原始函数指针大多已过时,应仅用于低级性能关键的东西。对于我们其他人来说,C++ 拥有更好的 std::function
。它可以轻松处理像您这样的案例。
如果您因为没有 C++11 编译器而无法使用它,boost::function
是一个替代品。
关于C++ 从类 B 中运行类 A 的函数指针作为回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204107/