別のクラス内からあるクラスのメソッドを実行しようとしています。ユーザーが自分の名前とパスワードを入力できる基本的な 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 (*)()'
アドバイスありがとう。