2010-05-24 50 views
8

給出的例子類:使用類中的一個成員函數指針

class Fred 
{ 
public: 
Fred() 
{ 
    func = &Fred::fa; 
} 

void run() 
{ 
    int foo, bar; 
    *func(foo,bar); 
} 

double fa(int x, int y); 
double fb(int x, int y); 

private: 
double (Fred::*func)(int x, int y); 
}; 

我在該行呼籲通過指針的成員函數「* FUNC(FOO,吧)」得到一個編譯錯誤,他說: 「術語不會評估爲帶有2個參數的函數」。我究竟做錯了什麼?

+0

謝謝你的編輯:) – 2010-05-24 16:05:39

+0

...沒問題;) – neuviemeporte 2010-05-24 16:08:36

回答

18

您所需要的語法如下:

((object).*(ptrToMember)) 

所以,你的電話是:

((*this).*(func))(foo, bar); 

我相信一種語法是:

(this->*func)(foo, bar); 
6

您需要以下通過指針調用成員函數的時髦語法:

(this->*func)(foo, bar); 
4

有兩件事你需要照顧。首先是函數指針類型的聲明:

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 

接着被用於使用指針調用函數的語法:

(this->*func)(foo,bar) 

這裏是修改樣本代碼,將編譯和運行:

#include <iostream> 

class Fred 
{ 
public: 
    Fred() 
    { 
    func = &Fred::fa; 
    } 

    void run() 
    { 
    int foo = 10, bar = 20; 
    std::cout << (this->*func)(foo,bar) << '\n'; 
    } 

    double fa(int x, int y) 
    { 
    return (double)(x + y); 
    } 
    double fb(int x, int y) 
    { 
    } 

private: 
    typedef double (Fred::*fptr)(int x, int y); 
    fptr func; 
}; 

int 
main() 
{ 
    Fred f; 
    f.run(); 
    return 0; 
} 
0

非靜態類成員函數已將此指針隱藏爲參數。

我認爲,語法 (this - > * func)(foo,bar) 是讓編譯器明白它需要添加到函數中的方法。

1

具有兩個參數的成員函數實際上是一個三參數函數。 '這'是一個隱含的論點,所以你得到的錯誤是關於錯過'this'arg。