3
// class
class MyClass
{
public:
void doIt() const
{
    cout << "It works!" << endl;
}

void(MyClass::*fPtr)() const;
};

// main

MyClass *t = new MyClass;

// store function address
t->fPtr = &MyClass::doIt;

(*(t->fPtr))(); // Whats wrong with this line?

fPtr に格納されている関数を呼び出すにはどうすればよいですか? 私が試したとき (*(t->fPtr))(); コンパイラはこれらのエラーを出します:

エラー C2171: '*': タイプ 'void (__thiscall MyClass::* )(void) const のオペランドは無効です

エラー C2064: 項は引数を 0 個取る関数として評価されません

4

2 に答える 2

2

fPtr関数のスコープ内で呼び出される変数はありませんmain()->演算子を使用してメンバー変数を参照し、次を使用してメンバーへのポインターを逆参照する必要があります->*

// main

MyClass *t = new MyClass;

// store function adress
t->fPtr = &MyClass::doIt;   

(t->*(t->fPtr))();

または、ローカル変数を作成して、メンバーへのポインターをそれに割り当てることもできます。

// main

MyClass *t = new MyClass;

// store function adress
t->fPtr = &MyClass::doIt;

void (MyClass::*fp)() const = t->fPtr;
(t->*fp)();

後者は、上記の奇妙に見える構造が必要な理由を明確にします。メンバーへのポインター型のメンバー変数を使用するオブジェクトとは異なるオブジェクトでメソッドを実行することもできます。

MyClass *s = new MyClass;
MyClass *t = new MyClass;

s->fPtr = &MyClass::f;
t->fPtr = &MyClass::g;

(t->*(s->fPtr))(); // Call f() on object *t
(s->*(t->fPtr))(); // Call g() on object *s

の左側のオブジェクトは->、どのオブジェクトからメンバーへのポインターを読み取るかをコンパイラーに伝え、一方の左側のオブジェクトは->*、メンバー関数を呼び出すオブジェクトをコンパイラーに伝えます。

于 2011-12-21T19:43:57.520 に答える
2

(*(t->fPtr))();は間違っています。正しい構文は次のとおりです((object)->*(ptrToMember))

意味

(t->*(t->fPtr))();

詳細な背景情報はこちら: http://www.parashift.com/c++-faq-lite/pointers-to-members.html (ただし、そのページのこれらのマクロは無視してください..)

于 2011-12-21T19:46:02.307 に答える