0

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

アドバイスありがとう。

4

3 に答える 3

0
  1. sayHello は静的関数である必要があります。通常のメンバー関数には暗黙のパラメーター「this」があるためです。したがって、sayHello の完全な署名は次のとおりです。void sayHello(Foo* this);

  2. 別の方法 -クラス member へのポインタを使用します。

  3. また、関数の代わりにファンクター構造を使用することもできます。

于 2013-06-20T02:06:29.220 に答える