2012-09-06 189 views
5

我正在嘗試使用指向函數成員的指針,我不能'弄清楚這是如何工作的。指向函數成員的指針

我有A類,看起來像這樣

class A 
{ 
    public: 
    float Plus (float a, float b) { return a+b; } 
    float Minus (float a, float b) { return a-b; } 
    float Multiply(float a, float b) { return a*b; } 
    float Divide (float a, float b) { return a/b; } 
}; 

我想一個指針申報A,然後一個函數指針傳遞給另一個函數A的成員之一

喜歡的東西是:

void Will_Get_Function_Pointer(float a, float b, float (A::*pt2Func)(float, float)) 
{ 
    (...) 
} 

在那裏我會像這樣的東西

01叫它

我不能在東西看起來像這樣

vector<A> vecA; 
myA = &vecA[xxx] 

這樣做可以使用靜態/ const的成員,因爲在我的最終執行情況的將指向特定的A A對象的集合在悲慘的失敗了

typedef float (A::*pA)(float x, float y); 
pA p = &myA->Minus; 

和編譯器告訴我使用& A ::負但不會爲我工作。

我可以這樣做嗎?

乾杯

回答

6
A* myA = new A; 
Will_Get_Function_Pointer(1.00,2.00, &myA->Minus) 

你不能。你應該使用類似

void Will_Get_Function_Pointer(A* object, float a, float b, 
float (A::*pt2Func)(float, float)) 
{ 
    (object->*pt2Func)(a, b); 
} 

,並稱其爲

A* myA = new A; 
Will_Get_Function_Pointer(myA, 1.00, 2.00, &A::Minus); 

簡單的例子。

http://liveworkspace.org/code/79939893695e40f1761d81ba834c5d15

+0

@ForEverT謝謝!它非常棒! –

2

不幸的是,語言不允許你使用該語法對象綁定到成員函數,使一個可調用對象。您可以在一個對象引用(或指針)傳遞,當你調用bind它的功能:

void Will_Get_Function_Pointer(float a, float b, A & obj, float (A::*pt2Func)(float, float)) 
{ 
    (obj.pt2Func)(a,b); 
} 

Will_Get_Function_Pointer(1.00, 2.00, myA, &A::Minus); 

或者你可以創建一個綁定的函數指針對象函數對象:

void Will_Get_Function(float a, float b, std::function<float(float,float)> f) 
{ 
    f(a,b); 
} 

Will_Get_Function(1.00, 2.00, std::bind(&A::Minus, &myA)); 

請注意,functionbind是C++ 11中的新增功能;如果您遇到舊版本的語言,Boost會提供等價物。

+0

+1綁定 - 這往往是去到一起函數的引用打交道時發揮作用。 – Marcin

+0

不能使用C++ 11或boost。但它的綁定語法確實非常好。 –

2

Use a macro.

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 

調用你的成員函數很簡單,因爲你already have a typedef您要調用的函數。

float result = CALL_MEMBER_FN(*myA, pA)(a, b); 
+0

不要錯過了常見問題的並行忠告聲明指向成員函數:使用typedef(http://www.parashift.com/c++-faq-lite/typedef-for-ptr-to-memfn。 HTML)。 –

+0

我認爲應該是'CALL_MEMBER_FN(*妙,PA)(X,Y);'因爲,儘管它的名字,你的宏不會所有東西。就我個人而言,我會發現'(myA-> pA)(x,y)'比這個混亂更可讀。 –

+0

哎呀,你當然是對的。固定。 –