2012-10-21 73 views
1

我有一個課堂作業,上面寫着:有一個函數指針類型是什麼意思?

寫聲明,它有兩個int參數並返回一個int的函數,並宣佈其元素有這個函數指針類型的向量。

由於函數和向量都是int,這是正確的嗎?我仍然對指針非常模糊。這是我的:

#include <iostream> 
#include <vector> 
using std::cin; using std::cout; using std::endl; using std::vector; 

// This is my function that take two ints and returns and int 
int AddFunc (int a, int b) { int addResult; addResult = a + b; return (addResult);} 

int main() 
{ 
    vector <int> v1; // Declare a vector whose elements have this functions pointer types 
    int add1, add2, add3 = 0; 
     cout << "Enter two numbers to be added with my AddFunc function: "; 
     cin >> add1 >> add2; 
     add3 = AddFunc (add1, add2); 
     cout << "The numbers added equal: " << add3 << endl; 
     v1.push_back(add3); 
     cout << "The first element in the vector v1 is: " << v1 [0] << endl; 
    return 0; 
} 
+1

順便說一句,有用的職業建議:不要養成將所有東西寫在一行上的習慣。它使事情變得難以閱讀。 –

回答

4

功能指針類型是int (*)(int, int)。你想這樣的:

typedef int (*fptr)(int, int); 

std::vector<fptr> v; 

例子:

int add(int a, int b) { return a + b; } 
int mul(int a, int b) { return a * b; } 

v.push_back(&add); 
v.push_back(&mul); 

然後是這樣的:

for (f : v) { std::cout << "f(5, 7) = " << f(5, 7) << std::endl; } 
+0

要讀取typedef行:將'fptr'類型定義爲一個指向具有兩個int參數並返回int的函數的指針。 –

2

在C++中,你有abilty定義一個函數指針,就像這樣:

int (*pfunc) (int, int); 

這是一個變量,whi CH您可以指定函數的地址,只要它指定的簽名,就像這樣:

pfunc = AddFunc; // Assign the adress of a function 
pfunc(1,2) // Now call the function through the pointer 

現在,請注意pfunc是變量名,其「官方」的類型是int (*) (int,int) 當然,這可能會變得很混亂,所以你可能想要typedef它:

typedef int (*AdderFunc)(int, int); 
AdderFunc pfunc = AddFunc; 
pfunc(1,2); 
1

該任務需要一個函數指針向量爲您的函數。如果你不習慣它們,函數指針有點難以閱讀。以下是可用於編寫函數指針類型的方法。

首先編寫函數的參數列表。 AddFunc()有兩個int參數,所以一開始你有:

(int, int) 

對於這是一個函數指針,你(*)前綴是:

(*)(int, int) 

最後,您有回報前綴整件事函數的類型。在這種情況下,int

int (*)(int, int) 

您可以使用它作爲,是爲您的載體類型:

std::vector<int (*)(int, int)> v; 

這將工作。但是,實際爲函數指針定義自己的類型通常更清楚(使用typedef)。起初,這樣做似乎很棘手,但很容易。您已經使用上述方法記錄了類型。唯一缺少的是給它一個名字。你可以通過在*(*)之後寫下名稱來完成此操作。例如(*func_ptr),所以你必須:

int (*func_ptr)(int, int) 

而這一切,你需要一個typedef

typedef int (*func_ptr)(int, int); 

現在只要您需要特定的函數指針類型,而不是:

int (*)(int, int) 

你可以這樣寫:

func_ptr 
改爲

。所以,你的矢量聲明變成:

std::vector<func_ptr> v; 

至於載體而言,func_ptr爲指針類型,就像任何其他。

函數指針不同於「常規」指針,因爲「解除引用」意味着調用它們指向的函數。您實際上並不取消引用函數指針。相反,您使用它們上的()運算符。這樣做會調用它們指向的功能。

分配給函數指針意味着給它分配函數的地址。舉例來說,如果你有func_ptr類型的變量(你typedef以上ED):

func_ptr AddFunc_p; 

您可以將它的AddFunc()與地址:

AddFunc_p = AddFunc; 

注意在AddFunc缺少的括號內。你只寫出函數的名字,因爲你不想真的調用這個函數,而是想要它的地址,所以你可以把它分配給AddFunc_p。現在,您可以撥打AddFunc()通過AddFunc_p

AddFunc_p(some_int, another_int); 

您現在應該可以扣除如何把函數指針的向量和如何應用()運營商在其元素。這將有助於記住矢量只包含func_ptr類型的元素。