簡體   English   中英

指向成員函數的C ++指針

[英]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;

}

我一直試圖找出答案,但似乎無法對其進行調試。

第二行的“無效初始化”。

這兩行都不會編譯。

  1. &Object::foo接受成員函數的地址,為您提供一個指向成員函數的指針。 它的類型是int (Object::*)(int*) ,所以p1的類型必須匹配。

  2. *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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM