[英]Class member function pointer as a class member
// 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:term不計算為采用0參數的函數
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
->
左邊的對象告訴編譯器哪個對象讀取指向成員的指針,而左邊的對象->*
告訴編譯器哪個對象調用成員函數。
(*(t->fPtr))();
是錯的,正確的語法是((object)->*(ptrToMember))
手段
(t->*(t->fPtr))();
更多背景信息: http : //www.parashift.com/c++-faq-lite/pointers-to-members.html (但最好忽略該頁面中的這些宏..)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.