2012-06-19 56 views
3

我這個代碼在書中如此困惑:誰能幫我解釋一下在C++中使用typedef?

typedef int (*healthCalcFunc) (const GameCharacter&) 

而且據我所知, typedef double* PDouble,意味着這個詞PDouble可用於指針申報double

但我無法弄清楚的typedef int (*healthCalcFunc) (const GameCharacter&)

含義是否有任何人可以幫我解釋一下嗎?

在此先感謝

:)

+0

重複的問題:http://stackoverflow.com/ questions/4295432/typedef-function-pointer –

回答

5
typedef int (*healthCalcFunc) (const GameCharacter&); 

它引入一個稱爲healthCalcFunc用於其描述了函數指針類型名稱,服用const GameCharacter&類型的一個參數,並且返回一個int

因此,這意味着,如果你的函數爲:

int some_function(const GameCharacter&) 
{ 
    //... 
} 

然後您可以創建一個指向對象,其將指向上面的函數爲:

healthCalcFunc pfun = some_function; 

,然後用pfun代替some_function爲:

some_function(args); /normal call 

pfun(args); //calling using function pointer 
      //it is exactly same as the previous call 

而與此受益方法是,你可以通過周圍pfun(或some_function)到其他功能:

void other_function(healthCalcFunc pfun) 
{ 
    //.. 
    pfun(args); //invoke the function! 
    //.. 
} 

healthCalcFunc pfun = some_function; 

other_function(some_function); 
other_function(pfun); 

這裏other_function將使用函數指針調用該函數。這樣,下次您可以將另一個匹配函數簽名的函數傳遞給other_function,並且other_function將調用另一個函數。

+0

typedef沒有定義一個新類型。 typedef爲類型定義了一個新名稱。 – harper

+0

@harper:我編輯了我的答案。 – Nawaz

0

這是一個function pointer - 希望你的書將在什麼地方解釋了這些;如果沒有,你最喜歡的搜索引擎應該能夠指引你在正確的方向。

0

這是返回int並將const GameCharacter&作爲參數的函數的函數指針的typedef。

您可以使用healthCalcFunc hp = &MyFunc;創建函數指針,然後將其用作int n = (*hp)(GameCharacter());。這裏MyFunc將具有此簽名:int MyFunc(const GameCharecter&);

5

在這種情況下,運算符優先順序會妨礙您的工作。

這創建的是一個別名(名爲healthCalcFunc),用於類型「指向函數的指針,該函數將引用const GameCharacter作爲其參數並返回一個int」。

  1. int:返回類型
  2. (*healthCalcFunc):指針的功能 - 必須在括號綁定*到名稱,而不是前述int,這將聲明一個函數返回一個指針,而不是所期望的指針的到一個功能。
  3. (const GameCharacter &):它將指向的函數類型的參數列表。
+0

總是很有趣,一個參數可以是const :) –

0

這是一個函數類型定義。乍一看,這很奇怪,但你會習慣它。基本上,它說的是,定義一個名爲healthCalcFunc的類型,其返回值是一個整數,並將一個常量GameCharacter引用作爲其唯一參數。

一般情況下,一個函數指針聲明的形式如下:

typedef return_type (*new_function_typename)(typeof_arg1, typeof_arg2, ...); 

而且你可以使用它像這樣:

new_function_typename functor; 
functor = some_other_functions_name; 
// or 
functor = dlsym(dlopen_handle, "some_function_name"); // for dynamic loading 

int retval = functor(arg1, arg2);