2011-12-21 5 views
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: '*':違法なタイプのオペランドの「無効(__thiscall MyClassの:: *)(無効)constは

エラーC2064:用語は、関数の撮影に評価されませんの0引数

+4

'(トン - > *(t-> fPtr))() '私はうまくいくと思うよ。 – KoKuToru

+0

@KoKuToru:それは間違っている。 – Nawaz

+0

@Nawazそれは私がそれをテストして動作します。 – KoKuToru

答えて

2

main()関数の範囲には、fPtrという変数はありません。あなたは->演算子を使用してメンバ変数を参照する必要があり、その後、ポインタ・ツー・メンバー->*を使用して逆参照:

// 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 

オブジェクト->の左側にpointer-を読み取るためにオブジェクトをコンパイラに指示しますメンバ関数を呼び出すときにはコンパイラに指示しますが、左のオブジェクトは->*の左側にあります。

関連する問題