2014-03-06 204 views
1
#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; 

} 

我一直想弄清楚這一點,但我似乎無法得到它的調試。C++指向成員函數的指針

第二行「無效初始化」。

+0

只有第二行? – chris

+0

「第二行」 - 你的意思是'使用命名空間標準;'?行編號有點有用... –

+0

抱歉,我的意思是int(Object :: *&p)(int *)= * Object :: foo行以及前一行。 – user3250551

回答

2

兩行都不會編譯。

  1. &Object::foo取得成員函數的地址,給你一個指向成員函數的指針。它的類型是int (Object::*)(int*),所以p1的類型必須匹配。

  2. *Object::foo嘗試在成員函數上執行間接尋址,這根本不是您可以執行的操作。間接是你在指針上執行的東西。

請注意,你給了p2類型是一個指向成員函數的引用,所以它不會綁定到一個暫時的。你可以,例如,而是執行此操作:

int (Object::*p1)(int *) = &Object::foo; 
int (Object::*&p2)(int *) = p1; 
+0

這適用於**&p2,但我仍然不確定如何定義一個雙指針Object :: ** p1(int *)= && Object :: foo? – user3250551

+0

我意識到它只是=&p1。謝謝! – user3250551

+0

@ user3250551你可能也想看看我的答案。它應該給你一些額外的見解。 –

0

對付引用成員函數指針的最簡單的方法是引入適當的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不等於ObjFPtrType&,但形成它自己的類型。
上面的示例編譯得很好,並通過GCC 4.8.2 on ideone驗證。