[英]C++ pointer to member function
#include<iostream>
using namespace std;
struct Object{
int foo(int *a){return 0;}
};
int main(){
int (Object::**p1)(int *) = &Object::foo;
int (Object::*&p2)(int *) = *Object::foo;
}
我一直試圖找出答案,但似乎無法對其進行調試。
第二行的“無效初始化”。
這兩行都不會編譯。
&Object::foo
接受成員函數的地址,為您提供一個指向成員函數的指針。 它的類型是int (Object::*)(int*)
,所以p1
的類型必須匹配。
*Object::foo
嘗試對成員函數執行間接操作,這根本不是您可以做的。 間接操作是您對指針執行的操作。
請注意,您為p2
提供的類型是對成員函數指針的引用,因此不會綁定到臨時函數。 例如,您可以這樣做:
int (Object::*p1)(int *) = &Object::foo;
int (Object::*&p2)(int *) = p1;
要處理對成員函數指針的引用,最簡單的方法是引入適當的typedef恕我直言:
struct Object {
int foo(int *a) { return 0; }
int bar(int *a) { return 1; }
};
typedef int (Object::*ObjFPtrType)(int *);
typedef int (Object::*&ObjFPtrTypeRef)(int *);
void setFnPtr(ObjFPtrType* p) {
*p = &Object::foo;
}
void setFnPtrRef(ObjFPtrTypeRef r) {
r = &Object::bar;
}
int main() {
ObjFPtrType p1 = 0;
setFnPtr(&p1);
ObjFPtrTypeRef p2 = p1;
setFnPtrRef(p2);
}
當我嘗試編寫和改進此答案時,我還ObjFPtrTypeRef
了一個事實,即ObjFPtrTypeRef
不等同於ObjFPtrType&
,而是形成了它自己的類型。
上面的樣品編譯良好,並在亞酮上用GCC 4.8.2進行了證明 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.