2011-12-21 178 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: '*':在void類型的」非法操作數(__thiscall MyClass的:: *)(無效)常量

錯誤C2064:術語不計算爲函數回吐0個參數

+4

'(T - > *(t-> fPtr))()'我認爲應該可以工作 – KoKuToru 2011-12-21 19:36:21

+0

@KoKuToru:這也是錯誤的。 – Nawaz 2011-12-21 19:37:24

+0

@Nawaz它的工作原理我測試了它。 – KoKuToru 2011-12-21 19:38:15

回答

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 

上的->左邊的對象告訴哪個對象讀取指針 - 編譯器:您還可以從它的成員指針到成員類型的變量使用一個不同的對象上執行的方法從->*左邊的對象告訴編譯器哪個對象調用成員函數。